题意:一个矩阵,每一个元素在 n*m 的范围内,且均不相同,满足格子的坐标 x1 , y1, x2, y2 当(x1^y1)>(x2^y2)时,第一个格子的元素值大于第二个元素值;
求满足条件的矩阵;
解:因为异或值小的格子元素一定比异或值大的格子元素小,且所有元素不相同;直接计算所有异或值不相同的值得个数求全排列;1->1000内的所有值异或最大仅为1023;
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> using namespace std; const int N = 1e6+10; typedef long long LL; const LL mod = 1e9+7; LL a[N]; int vis[1030]; int main() { a[0]=1; for(int i=1;i<=1000000;i++) a[i]=a[i-1]*i%mod; int t, n, m; scanf("%d", &t); while(t--) { scanf("%d %d", &n, &m); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { vis[i^j]++; } } LL ans=1; for(int i=0;i<=1024;i++) { ans=ans*a[vis[i]]%mod; } printf("%lld\n",ans%mod); } return 0; }