题解:CF2081F Hot Matrix
神秘构造题。不妨设
显然,当
考虑
那么这个
- 横边界与竖边界上的数互不相同;
- 对于每个
(x,y) (x \neq y ),在矩形中存在两个相邻的位置(i_1,j_1)(i_1,j_1+1) 和(i_2,j_2)(i_2,j_2+1) 使得\{b_{i_1,j_1},b_{i_1,j_1+1}\} = \{b_{i_2,j_2},b_{i_2,j_2+1}\} = \{x,y\} ; -
首先看怎么生成
然后是怎么生成
这样,
按照上述生成
当
以
126354
231465
615243
342516
564132
453621
它是中心对称的。接下来,我们将给出神之一笔:将
容易验证,这样得到的
#include<bits/stdc++.h>
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=3000+10;
int T,n,m,k,a[MAXN][MAXN],c[MAXN][MAXN],vis[MAXN];
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>T;
while(T--) {
cin>>n;
if(n==1) {cout<<"YES\n0\n";continue ;}
if(n%2) {cout<<"NO\n";continue;}
cout<<"YES\n",m=n/2;
ffor(i,1,m) vis[i]=0;
int l=2,r=m;a[1][1]=1;
ffor(i,2,m) if(i%2==0) a[1][i]=l++; else a[1][i]=r--;
ffor(i,2,m) a[i][1]=a[1][i];
ffor(i,2,m) ffor(j,2,m) a[i][j]=((a[i][1]-2+a[1][j])%m+m)%m+1;
ffor(i,2,m) {
int dt=min(i-1,m-i+1);
if(vis[dt]) c[1][i]=c[1][i-1]^1;
else c[1][i]=c[1][i-1],vis[dt]=1;
}
ffor(i,2,m) c[i][1]=c[1][i];
ffor(i,2,m) ffor(j,2,m) c[i][j]=c[i][1]^c[1][j];
if(m%2==0) {
int k=m/2;
ffor(i,1,k-1) ffor(j,k+2,m) c[i][j]^=1;
ffor(i,k+1,m) ffor(j,1,k) c[i][j]^=1;
ffor(i,k+2,m) ffor(j,1,k-1) c[i][j]^=1;
}
ffor(i,1,m) ffor(j,1,m) {
--a[i][j];
if(c[i][j]) a[i][j]=n-1-a[i][j];
a[i][n-j+1]=a[n-i+1][j]=n-1-a[i][j];
a[n-i+1][n-j+1]=a[i][j];
}
ffor(i,1,n) {
ffor(j,1,n) cout<<a[i][j]<<' ';
cout<<'\n';
}
}
return 0;
}