• [bzoj1002]轮状病毒


    啊啊啊啊大丧题!!!

    轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
    和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示

      N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
    同的3轮状病毒,如下图所示

      现给定n(N<=100),编程计算有多少个不同的n轮状病毒
     

    题意:裸的生成树计数,通过拉普拉斯矩阵基尔霍夫定理推出递推式f[i]=f[i-1]*3-f[i-2]+2
    高精度递推即可
    高精度好难打啊 高精度是什么垃圾玩意
     
    代码:
    #include<cstdio>
    #include<cstring>
    #define inf 0x3f3f3f3f
    #define r register
    #define min(a,b) (a<b?a:b)
    struct AriM{
        int d[101],len;
        AriM friend operator *(AriM a,int k){
            for(r int i=1;i<=a.len;i++)a.d[i]*=k;
            for(r int i=1;i<=a.len;i++){
                a.d[i+1]+=a.d[i]/10;
                a.d[i]%=10;
            }
            if(a.d[a.len+1])a.len++;
            return a;
        }
        AriM friend operator -(AriM a,AriM b){
            a.d[1]+=2;
            for(r int j=1;a.d[j]>=10;a.d[++j]++)a.d[j]%=10;
            for(r int i=1;i<=a.len;i++){
                   a.d[i]-=b.d[i];
                   if(a.d[i]<0)a.d[i]+=10,a.d[i+1]--;
            }
            while(!a.d[a.len])a.len--;
            return a;
        }
    }f[101]; 
    int main(){
        int n;
        scanf("%d",&n);
        f[1].d[1]=1;f[1].len=1;
        f[2].d[1]=5;f[2].len=1;
        for(r int i=3;i<=n;i++)f[i]=f[i-1]*3-f[i-2];
        for(r int i=f[n].len;i;i--)printf("%d",f[n].d[i]);
        puts("");
        return 0;
    }
    View Code
    本文由AristocratMarser编写,AristocratMarser代表火星向您问好,如果您不是在我的博客http://www.cnblogs.com/Marser上看到本文,请您向我联系,email:2962549995@qq.com
  • 相关阅读:
    2.1.4 现代计算机的设计原则(译)
    2.1.2 指令执行(译)
    计算机体系结构之一体系结构【译】
    2.2.1 比特【译】
    2.1.6 处理器级并行【译】
    jQery Datatables回调函数中文
    彪悍的人生不需要解释
    程序员读书雷达
    打开页面自动打开QQ的javascript代码
    EF大数据插入
  • 原文地址:https://www.cnblogs.com/Marser/p/7345440.html
Copyright © 2020-2023  润新知