/*本来要判断八个格子, *但是由于是从左往右从上往下填的, *只要判断左、左上、上、右上 */ const int dx[]={0,-1,-1,-1}; const int dy[]={-1,-1,0,1}; const int INF=1e9; bool used[10]; int ans=0; int a[5][5];
bool alright(int n,int x,int y) { for (int i=0;i<4;i++) { int xx=x+dx[i],yy=y+dy[i]; if (xx<1||yy<1||xx>3||yy>4) continue; if (abs(n-a[xx][yy])==1) return false; } return true; }
void dfs(int x,int y) { if (x==3&&y==4) { ans++; return; } for (int i=0;i<=9;i++) { if (!used[i]&&alright(i,x,y)) { a[x][y]=i; used[i]=true; if (y==4) dfs(x+1,1); else dfs(x,y+1); used[i]=false; a[x][y]=-INF; } } }
int main() { for (int i=1;i<=3;i++) { for (int j=1;j<=4;j++) { a[i][j]=-INF; } } dfs(1,2); printf("%d\n",ans); return 0; }
void swap(int a[], int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; }
int partition(int a[], int p, int r) { int i = p; int j = r + 1; int x = a[p]; while(1){ while(i<r && a[++i]<x); while(a[--j]>x); if(i>=j) break; swap(a,i,j); } ______________________; return j; }
void quicksort(int a[], int p, int r) { if(p<r){ int q = partition(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); } } int main() { int i; int a[] = {5,13,6,24,2,8,19,27,6,12,1,17}; int N = 12; quicksort(a, 0, N-1); for(i=0; i<N; i++) printf("%d ", a[i]); printf("\n"); return 0; }
void dfs(int dep) { if (dep==13) { //必须整除,变成乘法判断 if (a[10]==a[11]*a[12]) ans++; return; } if (dep==10) { if (a[7]*a[8]!=a[9]) return; } if (dep==7) { if (a[4]-a[5]!=a[6]) return; } if (dep==4) { if (a[1]+a[2]!=a[3]) return; } for (int i=1;i<=13;i++) { if (!used[i]) { used[i]=true; a[dep]=i; dfs(dep+1); a[dep]=-1; used[i]=false; } } }
int main() { dfs(1); printf("%d\n",ans); return 0; }
void resolve(int n) { int n1=n; for (int i=0;i<=sqrt(n1);i++) { int n2=n1-i*i; for (int j=0;j<=sqrt(n2);j++) { int n3=n2-j*j; for (int k=0;k<=sqrt(n3);k++) { int n4=n3-k*k; int l=sqrt(n4); if (l*l==n4) { printf("%d %d %d %d\n",i,j,k,l); return; } } } } }
int main() { int n; scanf("%d",&n); resolve(n); return 0; }