#include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for (int i=(a);i<(b);i++) #define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--) #define REP(i,n) for (int i=0;i<(n);i++) #define RREP(i,n) for (int i=(n)-1;i>=0;i--) #define INF 1<<30 #define MP make_pair #define mp make_pair #define pb push_back #define PB push_back #define DEBUG(x) cout<<#x<<": "< >& magic){ REP(i,n)REP(j,n)magic[i][j]=0; magic[0][n/2]=1; int i=0;int j=n/2;int cnt=1; while(true){ i=(i-1+n)%n; j=(j+1)%n; cnt++; if(magic[i][j]==0){ magic[i][j]=cnt;} else{ i=(i+2)%n;j=(j-1+n)%n; magic[i][j]=cnt; } if(cnt==n*n) break; } } void ULX(int n,vector >& ulx){ int u=n/2+1; REP(i,n){ if(i>n; vector > magic(n,vector(n,0)); if(n%2==1){ oddmagic(n,magic); } else if(n%4==0){ REP(i,n)REP(j,n){ if (i%4==j%4 || (i%4)+(j%4)==3)magic[i][j]=n*i+j+1; else magic[i][j]=n*n-(n*i+j); } }else if(n%4==2){ vector > half(n/2,vector(n/2,0)); oddmagic(n/2,half); REP(i,n/2) REP(j,n/2) half[i][j]=(half[i][j]-1)*4; REP(i,n) REP(j,n) magic[i][j]=half[i/2][j/2]; vector > ulx(n/2,vector(n/2)); ULX(n/2,ulx); REP(i,n)REP(j,n){ switch(ulx[i/2][j/2]){ case 'U': if (i%2==0 && j%2==0)magic[i][j]+=1; if (i%2==0 && j%2==1)magic[i][j]+=4; if (i%2==1 && j%2==0)magic[i][j]+=2; if (i%2==1 && j%2==1)magic[i][j]+=3; break; case 'L': if (i%2==0 && j%2==0)magic[i][j]+=4; if (i%2==0 && j%2==1)magic[i][j]+=1; if (i%2==1 && j%2==0)magic[i][j]+=2; if (i%2==1 && j%2==1)magic[i][j]+=3; break; case 'X': if (i%2==0 && j%2==0)magic[i][j]+=1; if (i%2==0 && j%2==1)magic[i][j]+=4; if (i%2==1 && j%2==0)magic[i][j]+=3; if (i%2==1 && j%2==1)magic[i][j]+=2; break; } } } REP(i,n){ REP(j,n) cout<