【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.

再加上高精度

posted @ 2016-03-25 17:39  Yangjiyuan  阅读(205)  评论(0编辑  收藏  举报