sgu-221 Big Bishops

来源:互联网 发布:单片机型号大全 编辑:程序博客网 时间:2024/05/21 20:26

 不想说什么了,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;}


0 0