题目链接:https://codeforc.es/contest/1802/problem/C
大意是构造一个n*m的矩阵,使得2*2的子矩阵与它相邻的对角2*2的子矩阵异或和相等,求存在多少不同的数,构造出来。
很显然我们需要满足任意子矩阵,做法就是随机化这个矩阵,然后用一个我们预定的异或和的res,反向异或它的上左和左上的点,这样就可以满足对全局的构造,好题!这题要的就是胆大心细
code:
const int nn = 210; ll mod = 1e18+3; ll a[nn][nn]; void solve() { int n,m; cin>>n>>m; srand((unsigned)time(NULL)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ll k1 = rand()%mod,k2 = rand()%mod,k3 = rand()%mod; a[i][j] = (k1*k2*k3+mod)%mod; } } ll res = (1LL<<62)-5; for(int i=2;i<=n;i++){ for(int j=2;j<=m;j++){ a[i][j] = res^a[i-1][j]^a[i][j-1]^a[i-1][j-1]; } } cout<<n*m<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) cout<<a[i][j]<<' '; cout<<endl; } }