codeforec 1208C Magic Grid(构造题)

题目链接:传送门

题意:

​ 给你一个n,满足n是4的倍数。让你构造一个 n n n*n nn的矩阵,满足该矩阵的元素分别为 0 0 0 n n 1 n*n-1 nn1。且不重复。还要满足矩阵每一行每一列元素的异或值都相同

思路:

​ 这两天发现了异或的另一个性质: 4 k , 4 k + 1 , 4 k + 2 , 4 k + 3 4*k,4*k+1,4*k+2,4*k+3 4k,4k+1,4k+2,4k+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;
}