标签:sgu
不想说什么了,220-221两道一样的题目,就是一个数据大点,要高精度而已
http://blog.csdn.net/qq_21995319/article/details/42834743
AC代码:
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)>(b)?(b):(a)) using namespace std; int f[2][110][2510][25]={{{{0}}}}; int ans[200]={0}; int sum[210]={0}; int sums=0; int n,k; //ans+=f[1][p][q]*f[0][2*n-1-p][k-q]; void Addans(int q) { int g=f[1][sums][q][0]+f[0][2*n-1-sums][k-q][0]-1; ans[0]=MAX(ans[0],g); for(int i=1;i<=f[1][sums][q][0];i++) { for(int j=1;j<=f[0][2*n-1-sums][k-q][0];j++) { ans[i+j-1]+=f[1][sums][q][i]*f[0][2*n-1-sums][k-q][j]; ans[i+j]+=ans[i+j-1]/10000; ans[i+j-1]%=10000; } } for(int i=1;i<=ans[0];i++) { ans[i+1]+=ans[i]/10000; ans[i]%=10000; } for(int i=ans[0]+1;ans[i]>0;i++,ans[0]++) { ans[i+1]+=ans[i]/10000; ans[i]%=10000; } return; } void Add(int K,int p,int q) { f[K][p][q][0]=MAX(f[K][p-1][q][0],f[K][p-1][q-1][0]); for(int i=1;i<=f[K][p][q][0];i++) { f[K][p][q][i]+=f[K][p-1][q][i]+f[K][p-1][q-1][i]*(sum[p]-q+1); f[K][p][q][i+1]+=f[K][p][q][i]/10000; f[K][p][q][i]%=10000; } for(int i=f[K][p][q][0]+1;f[K][p][q][i]>0;i++,f[K][p][q][0]++) { f[K][p][q][i+1]+=f[K][p][q][i]/10000; f[K][p][q][i]%=10000; } return; } void done(int K) { sums=0; for(int i=K;i<=n;i+=2) { sum[++sums]=i; if(i!=n) sum[++sums]=i; } f[K-1][0][0][0]=1; f[K-1][0][0][1]=1; for(int i=1;i<=sums;i++) for(int j=0;j<=k;j++) if(sum[i]>=j-1) Add(K-1,i,j); return; } int main() { cin>>n>>k; done(1); done(2); for(int i=0;i<=k;i++) Addans(i); for(;ans[ans[0]]==0 && ans[0]>1;ans[0]--); printf("%d",ans[ans[0]]); for(int i=ans[0]-1;i>0;i--) printf("%04d",ans[i]); return 0; }
标签:sgu
原文地址:http://blog.csdn.net/qq_21995319/article/details/42835165