[思维构造] 题解 Coloring Torus
[思维构造] 题解 Coloring Torus
这道题目,实在是想不出来,看了题解。
题目分析
如果 \(k\le 500\) 可以这样无脑构造:
\[\begin{matrix}
1& 1& \cdots& 1 \\
2& 2& \cdots& 2 \\
\vdots& \vdots& \ddots& \vdots \\
k& k& \cdots& k \\
\end{matrix}
\]
当 \(k>500\) 时,注意到 \(k\) 最大时 \(1000\) ,恰好是 \(500\) 的两倍,这可能暗示着什么。
注意到下面这种方案是满足条件的:
\[\begin{matrix}
1& 2& 3& 4& 5& 6\\
2& 3& 4& 5& 6& 1\\
3& 4& 5& 6& 1& 2\\
4& 5& 6& 1& 2& 3\\
5& 6& 1& 2& 3& 4\\
6& 1& 2& 3& 4& 5\\
\end{matrix}
\]
如果我们把奇数行的某个数字替换成原本不存在的数字,那么得到的矩阵仍然是满足条件的:
\[\begin{matrix}
7& 2& 3& 4& 5& 6\\
2& 3& 4& 5& 6& 1\\
3& 4& 5& 6& 7& 2\\
4& 5& 6& 1& 2& 3\\
5& 6& 7& 2& 3& 4\\
6& 1& 2& 3& 4& 5\\
\end{matrix}
\]
如果我们把奇数行的任意多个数字都替换成相应多个原本不存在的数字,那么得到的矩阵仍然是满足条件的:
\[\begin{matrix}
7& 2& 3& 8& 9& 6\\
2& 3& 4& 5& 6& 1\\
3& 8& 9& 6& 7& 2\\
4& 5& 6& 1& 2& 3\\
9& 6& 7& 2& 3& 8\\
6& 1& 2& 3& 4& 5\\
\end{matrix}
\]
当然,这个需要建立在 \(n\) 是偶数的前提下, \(500\) 就是偶数。
由此我们就可以先构建出这样的矩阵,然后相应地替换掉这些位置的数字即可。
参考代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ch() getchar()
#define pc(x) putchar(x)
using namespace std;
template<typename T>void read(T&x){
static char c;static int f;
for(c=ch(),f=1;c<'0'||c>'9';c=ch())if(c=='-')f=-f;
for(x=0;c>='0'&&c<='9';c=ch())x=x*10+(c&15);x*=f;
}
template<typename T>void write(T x){
static char q[65];int cnt=0;
if(x<0)pc('-'),x=-x;
q[++cnt]=x%10,x/=10;
while(x)
q[++cnt]=x%10,x/=10;
while(cnt)pc(q[cnt--]+'0');
}
int main(){
int k;read(k);
if(k<=500){
write(k),pc('\n');
for(int i=1;i<=k;++i)
for(int j=1;j<=k;++j)
write((i+j-2)%k+1),pc(" \n"[j==k]);
}
else{
k-=500;
write(500),pc('\n');
for(int i=1;i<=500;++i){
for(int j=1;j<=500;++j){
int tmp=(i+j-2)%500+1;
if((i&1)&&tmp<=k)tmp+=500;
write(tmp),pc(" \n"[j==500]);
}
}
}
return 0;
}