码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj1002]轮状病毒

时间:2017-08-11 14:50:20      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:http   geo   矩阵   span   递推   编程   垃圾   .com   pen   

啊啊啊啊大丧题!!!

轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个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

 

[bzoj1002]轮状病毒

标签:http   geo   矩阵   span   递推   编程   垃圾   .com   pen   

原文地址:http://www.cnblogs.com/Marser/p/7345440.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!