bzoj1089: [SCOI2003]严格n元树

这题方程就是f(i)=f(i-1)^n+1

高精度谢谢。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
    int a[1100],len;
    node(){}
    void init()
    {
        memset(a,0,sizeof(a));a[1]=1;
        len=1;
    }
    void jia(int x)
    {
        a[1]+=x;
        for(int i=1;i<=len;i++)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        int i=len;
        while(a[i+1]>0)
        {
            i++;
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
    }
    node cheng(node n1,node n2)
    {
        node n3;n3.len=n1.len+n2.len-1;
        memset(n3.a,0,sizeof(n3.a));
        
        for(int i=1;i<=n1.len;i++)
            for(int j=1;j<=n2.len;j++)
                n3.a[i+j-1]+=n1.a[i]*n2.a[j];
        for(int i=1;i<=n3.len;i++)
        {
            n3.a[i+1]+=n3.a[i]/10;
            n3.a[i]%=10;
        }
        int i=n3.len;
        while(n3.a[i+1]>0)
        {
            i++;
            n3.a[i+1]+=n3.a[i]/10;
            n3.a[i]%=10;
        }
        n3.len=i;
        return n3;
    }
    void jian(node n2)
    {    
        for(int i=1;i<=len;i++)a[i]-=n2.a[i];
        for(int i=1;i<=len;i++)
        {
            if(a[i]<0)
            {
                a[i]+=10;
                a[i+1]--;
            }
        }
        while(a[len]==0)len--;
    }
}f[2];
int main()
{
    int n,d;
    scanf("%d%d",&n,&d);
    int now=0;f[now].init();
    for(int i=1;i<=d;i++)
    {
        now=1-now;
        f[now].init();
        for(int j=1;j<=n;j++)
            f[now]=f[now].cheng(f[1-now],f[now]);
        f[now].jia(1);
    }
    f[now].jian(f[1-now]);
    for(int i=f[now].len;i>=1;i--)printf("%d",f[now].a[i]);
    printf("\n");
    return 0;
}

 

posted @ 2018-03-07 20:26  AKCqhzdy  阅读(168)  评论(0编辑  收藏  举报