#include<iostream> #include<cassert> using namespace std; int N; int F[1<<10][1<<10]; bool solve() { if(N==1)return false; for(int i=0;i<1<<N;i++)for(int j=0;j<1<<10;j++)F[i][j]=0; auto add=[](int u,int v,int c) { F[u][v]=c; F[v][u]=-c; }; if(N%2==0) { for(int k=0;k<N;k+=2) { int u=1<<k,v=1<<k+1; for(int i=0;i<1<<N;i++)if(!(i&(u|v))) { add(i,i|u,1); add(i|u,i|u|v,1); add(i|u|v,i|v,1); add(i|v,i,1); } } } else { for(int k=3;k<N;k+=2) { int u=1<<k,v=1<<k+1; for(int i=0;i<1<<N;i++)if(!(i&(u|v))) { add(i,i|u,1); add(i|u,i|u|v,1); add(i|u|v,i|v,1); add(i|v,i,1); } } int u=1,v=2,w=4; for(int i=0;i<1<<N;i++)if(!(i&(u|v|w))) { add(i|u,i,1); add(i|v,i,1); add(i|u,i|u|v,1); add(i|v,i|u|v,1); add(i|u|w,i|w,-1); add(i|v|w,i|w,-1); add(i|u|w,i|u|v|w,-1); add(i|v|w,i|u|v|w,-1); add(i,i|w,2); add(i|u|v,i|u|v|w,2); add(i|u,i|u|w,-2); add(i|v,i|v|w,-2); } } {//validation int mx=0; for(int i=0;i<1<<N;i++) { int sum=0; for(int j=0;j<1<<N;j++) { assert((F[i][j]!=0)==(__builtin_popcount(i^j)==1)); assert(F[i][j]==-F[j][i]); sum+=F[i][j]; mx=max(mx,abs(F[i][j])); } assert(sum==0); } assert(mx==(N%2==0?1:2)); } return true; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>N; if(!solve())cout<<"No"<<endl; else { cout<<"Yes\n"; for(int i=0;i<1<<N;i++) { for(int j=0;j<1<<N;j++)cout<<F[i][j]<<(j+1==(1<<N)?"\n":" "); } } }