Codeforces 12 E. Start of the season
問題
与えられた偶数nに対して、以下の条件を満たすnxn行列を出力せよ。
- 対称行列である(a[i][j]=a[j][i])
- 各行には0〜n-1が1度ずつ出現する
- 各列には0〜n-1が1度ずつ出現する
制約条件
n≦1000
方針
a[i][j] = (i+j)%(n-1)+1とかしてみると、
i=n-1とj=n-1だけ崩れる。
端には1,3,5,..,n-1,2,4,6,...,n-2,0という順で数字を入れるとちょうどよいので、
そのように入れる。
(i*2+j*2)%(n-1)としている解が多かった。(なぜだろう)
ソースコード
int n; void run() { cin>>n; rep(i,n)rep(j,n){ if(i==j)cout<<0; else if(i==n-1||j==n-1){ int a=j==n-1?i:j; cout<<(a<n/2?a*2+1:(a-n/2+1)*2); } else cout<<1+(i+j)%(n-1); cout<<(j==n-1?"\n":" "); } }