/幻方构造(l!=2)
#define MAXN 100
void dllb(int l,int si,int sj,int sn,int d[][MAXN]){
int n,i=0,j=l/2;
for (n=1;n<=l*l;n++){
d[i+si][j+sj]=n+sn;
if (n%l){
i=(i)?(i-1):(l-1);
j=(j==l-1)?0:(j+1);
}
else
i=(i==l-1)?0:(i+1);
}
}
void magic_odd(int l,int d[][MAXN]){
dllb(l,0,0,0,d);
}
void magic_4k(int l,int d[][MAXN]){
int i,j;
for (i=0;i<l;i++)
for (j=0;j<l;j++)
d[i][j]=((i%4==0||i%4==3)&&(j%4==0||j%4==3)||(i%4==1||i%4==2)&&(j%4==1||j%4==2))?(l*l-(i*l+j)):(i*l+j+1);
}
void magic_other(int l,int d[][MAXN]){
int i,j,t;
dllb(l/2,0,0,0,d);
dllb(l/2,l/2,l/2,l*l/4,d);
dllb(l/2,0,l/2,l*l/2,d);
dllb(l/2,l/2,0,l*l/4*3,d);
for (i=0;i<l/2;i++)
for (j=0;j<l/4;j++)
if (i!=l/4||j)
t=d[i][j],d[i][j]=d[i+l/2][j],d[i+l/2][j]=t;
t=d[l/4][l/4],d[l/4][l/4]=d[l/4+l/2][l/4],d[l/4+l/2][l/4]=t;
for (i=0;i<l/2;i++)
for (j=l-l/4+1;j<l;j++)
t=d[i][j],d[i][j]=d[i+l/2][j],d[i+l/2][j]=t;
}
void generate(int l,int d[][MAXN]){
if (l%2)
magic_odd(l,d);
else if (l%4==0)
magic_4k(l,d);
else
magic_other(l,d);
}