/* 假设当前有a个A b个B c个C 用 f[a][b][c]来表示 那么如果这个串以A结尾 那就是 f[a-1][b][c]转移来的 所以构成 f[a][b][c]的串一定有一部分是 f[a-1][b][c] 同理 B C 所以: f[a][b][c] = f[a-1][b][c]+f[a][b-1][c]+f[a][b][c-1] 至于题目里那个什么前缀什么规则 既然f[1][1][1] 合法 那么他转移出来的 f[1][1][2] f[1][2][1] f[2][1][1]自然也合法 最后输出 f[n][n][n] */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int f[61][61][61][101],n; void add(int i,int j,int k,int a,int b,int c) { int l; for(l=1;l<=100;l++) f[i][j][k][l]=f[i][j][k][l]+f[a][b][c][l]; for(l=1;l<=100;l++) if(f[i][j][k][l]>=10) { f[i][j][k][l+1]++; f[i][j][k][l]-=10; } } int main() { cin>>n; int i,j,k; f[0][0][0][1]=1; f[0][0][0][0]=1; for(i=0;i<=n;i++) for(j=0;j<=i;j++) for(k=0;k<=j;k++) { if(i>0) add(i,j,k,i-1,j,k); if(j>0) add(i,j,k,i,j-1,k); if(k>0) add(i,j,k,i,j,k-1); } for(i=100;i>=1;i--) if(f[n][n][n][i]>0) { k=i;break; } for(i=k;i>=1;i--) cout<<f[n][n][n][i]; return 0; }