C. Magic Grid
Let us define a magic grid to be a square matrix of integers of size n×nn×n, satisfying the following conditions.
- All integers from 00 to (n2−1)(n2−1) inclusive appear in the matrix exactly once.
- Bitwise XOR of all elements in a row or a column must be the same for each row and column.
You are given an integer nn which is a multiple of 44. Construct a magic grid of size n×nn×n.
The only line of input contains an integer nn (4≤n≤10004≤n≤1000). It is guaranteed that nn is a multiple of 44.
Print a magic grid, i.e. nn lines, the ii-th of which contains nn space-separated integers, representing the ii-th row of the grid.
If there are multiple answers, print any. We can show that an answer always exists.
4
8 9 1 13 3 12 7 5 0 2 4 11 6 10 15 14
8
19 55 11 39 32 36 4 52 51 7 35 31 12 48 28 20 43 23 59 15 0 8 16 44 3 47 27 63 24 40 60 56 34 38 6 54 17 53 9 37 14 50 30 22 49 5 33 29 2 10 18 46 41 21 57 13 26 42 62 58 1 45 25 61
In the first example, XOR of each row and each column is 1313.
In the second example, XOR of each row and each column is 6060.
题意:构造一个这样的矩阵:第 i 行的异或和==第 i 列的异或和
题解:若已知一个满足题意的矩阵,对这个矩阵的每一个数加上一个4的倍数依然满足题意,又因为n是4的倍数,所以不断用这样的4*4矩阵凑成一个n*n的矩阵即可
#include<iostream> #include<algorithm> using namespace std; int a[1024][1024]; int main() { int n,cnt=0; cin>>n; for(int i=1;i<=n;i=i+4) { for(int j=1;j<=n;j=j+4) { for(int x=0;x<4;x++) { for(int y=0;y<4;y++) { a[i+x][j+y]=cnt++; } } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(j==1) cout<<a[i][j]; else cout<<' '<<a[i][j]; } cout<<endl; } return 0; }