codeforec 1208C Magic Grid(构造题)
题目链接:传送门
题意:
给你一个n,满足n是4的倍数。让你构造一个 n∗n的矩阵,满足该矩阵的元素分别为 0 到 n∗n−1。且不重复。还要满足矩阵每一行每一列元素的异或值都相同
思路:
这两天发现了异或的另一个性质: 4∗k,4∗k+1,4∗k+2,4∗k+3的异或值为0。
所以我们构造的矩阵可以第一列竖着来先4个连续的,第二列接着,就这样一直到第n列。然后再从第一列开始,在前面放的基础上再来4个连续的。
这样每一列每一行的异或值都为0
举个例子:
8
0 4 8 12 16 20 24 28
1 5 9 13 17 21 25 29
2 6 10 14 18 22 26 30
3 7 11 15 19 23 27 31
32 36 40 44 48 52 56 60
33 37 41 45 49 53 57 61
34 38 42 46 50 54 58 62
35 39 43 47 51 55 59 63
代码:
#include<bits/stdc++.h>
#define mset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int inf=0x3f3f3f3f;
const int N=2e3+10;
const int mod=1e9+7;
int grid[1005][1005];
int main()
{
int n;
cin>>n;
int now=0;
for(int i=1; i<=n; i+=4)
{
for(int k=1; k<=n; ++k)
{
for(int j=i; j<=i+3; ++j)
grid[j][k]=now++;
}
}
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=n; ++j)
cout<<grid[i][j]<<" ";
puts("");
}
return 0;
}