【bzoj1002】 [FJOI2007]轮状病毒DP
递推+环状特殊处理+高精度
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int n; int f[105][50],sum[50]; void mul(int* a,int* b,int x) { a[0]=max(a[0],b[0]); for (int i=1;i<=b[0];i++) a[i]+=x*b[i]; for (int i=1;i<=a[0];i++) if (a[i]>=10) { if (i==a[0]) a[0]++; a[i+1]+=a[i]/10; a[i]%=10; } } int main() { scanf("%d",&n); f[0][0]=f[0][1]=1; for (int i=1;i<n;i++) for (int j=1;j<=i;j++) mul(f[i],f[i-j],j); for (int i=1;i<=n;i++) mul(sum,f[n-i],i*i); for (int i=sum[0];i>=1;i--) printf("%d",sum[i]); return 0; }
另外有一种方法
记f[n]为n轮状的答案
观察下列式子
f[1]=1=1*1
f[2]=5=5*1*1
f[3]=16=4*4
f[4]=45=5*3*3
f[5]=121=11*11
f[6]=320=5*8*8
可以发现,n为奇数时,f[n]=F[n]*F[n]。
n为偶数时,f[n]=5*F[n]*F[n]。
其中F[n]=F[n-1]*3-F[n-2],F[1]=1,F[2]=4.
再加上高精度