不想说什么了,220-221两道一样的题目,就是一个数据大点,要高精度而已
http://blog.youkuaiyun.com/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;
}