。。。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=460000;
const int MAXM=10000;
int n,flag,square_flag[MAXM],val_flag[MAXN];
long long val[65][65];
long long sear(long long num)
{
for(long long i=2;;i++)
{
if(i*i>=num&&((i<MAXM&&!square_flag[i])||(i>=MAXM)))
return i;
}
}
void dfs(int x,int y,long long now)
{
if(flag)
return;
long long i,j,suma,sumb,diff,tmp,sum;
if(x==n&&y==n)
{
suma=sumb=0;
for(i=1;i<n;i++)
{
suma+=val[i][y];
sumb+=val[x][i];
}
for(i=2;;i++)
{
if(i<MAXM&&square_flag[i])
continue;
double g=sqrt(i*i-suma+sumb);
if(i*i-suma>0&&g==(int)g&&((g<MAXM&&!square_flag[(int)g])||g>=MAXM))
{
val[x][y]=i*i-suma;
flag=1;
return;
}
diff=sumb-suma;
if((i+1)*(i+1)-i*i>diff)
{
tmp=0;
for(j=1;j<=n;j++)
{
tmp+=val[j][y-1];
}
square_flag[(int)sqrt(tmp)]=0;
dfs(x,y-1,now+1);
return;
}
}
}
else if(x==n)
{
sum=0;
for(i=1;i<n;i++)
sum+=val[i][y];
i=sear(sum+now);
while(val_flag[i*i-sum]||square_flag[i])
i++;
val[x][y]=i*i-sum;
val_flag[i*i-sum]++;
square_flag[i]++;
dfs(x,y+1,now);
}
else if(y==n)
{
sum=0;
for(i=1;i<n;i++)
sum+=val[x][i];
i=sear(sum+now);
while(val_flag[i*i-sum])
i++;
val[x][y]=i*i-sum;
val_flag[i*i-sum]++;
square_flag[i]++;
dfs(x+1,1,now);
}
else
{
val[x][y]=now;
val_flag[now]++;
while(val_flag[now+1])
now++;
dfs(x,y+1,now+1);
}
}
int main()
{
while(cin>>n)
{
if(n==1)
{
printf("No Solution\n");
continue;
}
memset(square_flag,0,sizeof(square_flag));
memset(val_flag,0,sizeof(val_flag));
flag=0;
dfs(1,1,1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<n;j++)
printf("%lld ",val[i][j]);
printf("%lld\n",val[i][n]);
}
}
}