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":" ");
	}
}