题目链接: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;
	}
}