原文連接https://www.cnblogs.com/zhouzhendong/p/AGC030C.htmlhtml
才發現當時是被題意殺了。c++
當時理解的題意是「對於任意的 (i,j) ,顏色 i 和 顏色 j 的相鄰格子對數相同」。好像當時看了樣例都沒有發現被題意殺……git
迴歸正題。spa
若是要構造 n = k 的,那麼直接 構造一個第 i 行爲 i 的就行了。code
那麼 n<k<=2n 呢?htm
咱們考慮斜着的列。blog
若是第 i 個斜列放 i ,那麼也能夠達到 n = k 的目的。get
若是第 i 個斜列間隔放兩種數,那麼仍然能夠知足條件。這時候就能夠作到 $k\in [n,2n]$ 了。it
放個圖便於理解。(下圖藍線穿過的列是特殊的列)class
#include <bits/stdc++.h> using namespace std; typedef long long LL; LL read(){ LL x=0; char ch=getchar(); while (!isdigit(ch)) ch=getchar(); while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return x; } const int N=505; int n,k; int g[N][N]; int main(){ k=read(); n=min(k,500); for (int i=1;i<=n;i++){ int x=1,y=i; for (int j=1;j<=n;j++){ g[x][y]=i; x=x%n+1,y=y%n+1; } } for (int i=n+1;i<=k;i++){ int x=1,y=i-n; for (int j=1;j<=n;j++){ if (j&1) g[x][y]=i; x=x%n+1,y=y%n+1; } } printf("%d\n",n); for (int i=1;i<=n;i++,puts("")) for (int j=1;j<=n;j++) printf("%d ",g[i][j]); return 0; }