C. Magic Grid
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Let us define a magic grid to be a square matrix of integers of size n×nn×n, satisfying the following conditions.
You are given an integer nn which is a multiple of 44. Construct a magic grid of size n×nn×n.
Input
The only line of input contains an integer nn (4≤n≤10004≤n≤1000). It is guaranteed that nn is a multiple of 44.
Output
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.
Examples
input
Copy
4
output
Copy
8 9 1 13 3 12 7 5 0 2 4 11 6 10 15 14
input
Copy
8
output
Copy
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
Note
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.
把任意一个符合条件的4*4矩阵扩展成n*n的矩阵。把每一块标号。
例如一个8*8的矩阵可以标号为
1 2
3 4
第一块可以是:
4
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 158
0 1 2 3 16 17 18 19
4 5 6 7 20 21 22 23
8 9 10 11 24 25 26 27
12 13 14 15 28 29 30 31
32 33 34 35 48 49 50 51
36 37 38 39 52 53 54 55
40 41 42 43 56 57 58 59
44 45 46 47 60 61 62 63把第二块*16+第一块,第三块+32......分完块之后填数即可。这样可以保证异或完之后值不变,因为异或了偶数次,异或的那个值为0.
a^b^c^d=(a+16)^(b+16)+...。
getIndex(i,j)*16+a[i%4][j%4] 这个标号思想很重要。
#include <algorithm> //STL通用算法
#include <bitset> //STL位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> //复数类
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque> //STL双端队列容器
#include <exception> //异常处理类
#include <fstream>
#include <functional> //STL定义运算函数(代替运算符)
#include <limits>
#include <list> //STL线性列表容器
#include <map> //STL 映射容器
#include <iomanip>
#include <ios> //基本输入/输出支持
#include<iosfwd> //输入/输出系统使用的前置声明
#include <iostream>
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <queue> //STL队列容器
#include <set> //STL 集合容器
#include <sstream> //基于字符串的流
#include <stack> //STL堆栈容器
#include <stdexcept> //标准异常类
#include <streambuf> //底层输入/输出支持
#include <string> //字符串类
#include <utility> //STL通用模板类
#include <vector> //STL动态数组容器
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 2500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
int n,m;
int a[4][4];
int getIndex(int x,int y)
{
return n/4*(x/4)+y/4;
}
int main()
{
int num=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
a[i][j]=num++;
}
}
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d%c",getIndex(i,j)*16+a[i%4][j%4],j==n-1?'\n':' ');
}
//printf("\n");
}
}