• BZOJ 1089 严格n元树 (递推+高精度)


    题解:用a[i]表<=i时有几种树满足度数要求,那么这样就可以递归了,a[i]=a[i-1]^n+1。n个节点每个有a[i-1]种情况,那么将其相乘,最后加上1,因为深度为0也算一种。那么答案就是a[n]-a[n-1]。然后就是高精度的问题了,发现很久没有现码高精度没手感了,连高进度加法进位都出了些问题,需要特别注意。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct data{int len,a[2002];}a[35],c,p,t;
    int n,d;
    data mul(data a,data b){
        memset(c.a,0,sizeof c.a);
        for(int i=1;i<=a.len;i++)
        for(int j=1;j<=b.len;j++){
            c.a[i+j-1]+=a.a[i]*b.a[j];
            c.a[i+j]+=c.a[i+j-1]/10000;
            c.a[i+j-1]%=10000;
        }c.len=2000;
        while(c.len&&!c.a[c.len])c.len--;
        return c;
    }
    data sum(data a,data b){
        memset(c.a,0,sizeof c.a); 
        c.len=max(a.len,b.len);
        for(int i=1;i<=c.len;i++){
            c.a[i]+=a.a[i]+b.a[i];
            c.a[i+1]+=c.a[i]/10000;
            c.a[i]%=10000;
        }c.len=2000;
        while(c.len&&!c.a[c.len])c.len--;
        return c;
    }
    data sub(data a,data b){
        memset(c.a,0,sizeof c.a);
        c.len=a.len;
        for(int i=1;i<=a.len;i++){
            c.a[i]=a.a[i]-b.a[i];
            if(c.a[i]<0)c.a[i]+=10000,a.a[i+1]--;
        }while(c.len&&!c.a[c.len])c.len--;
        return c;
    }
    data power(data a,int b){
        memset(p.a,0,sizeof p.a); p.len=1; p.a[1]=1;
        while(b){
            if(b&1)p=mul(p,a);
            b>>=1; a=mul(a,a); 
        }return p;
    }
    data op(data a,int b){
        t.len=1; t.a[1]=1;
        return sum(power(a,b),t);
    }
    int main(){
        scanf("%d%d",&n,&d);
        if(!d)return puts("1"),0;
        a[0].len=1; a[0].a[1]=1;
        for(int i=1;i<=d;i++)a[i]=op(a[i-1],n);
        a[d]=sub(a[d],a[d-1]);
        printf("%d",a[d].a[a[d].len]);
        for(int i=a[d].len-1;i;i--)printf("%04d",a[d].a[i]);
        return 0;
    }
    
  • 相关阅读:
    基数排序
    阅读笔记
    构建之法阅读笔记
    找水王续
    单元测试
    个人总结
    表单整数的校验问题
    HTML 表格的书写方式:
    rgba兼容IE系列
    "position:relative"在IE中的Bug
  • 原文地址:https://www.cnblogs.com/forever97/p/bzoj1089.html
Copyright © 2020-2023  润新知