首页 > 代码库 > BZOJ1002 轮状病毒

BZOJ1002 轮状病毒

Description

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

技术分享

 

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

技术分享

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

Input

  第一行有1个正整数n

Output

  计算出的不同的n轮状病毒数输出

 

基尔霍夫矩阵(啥...) 递推式f(i)=f(i-1)*3-f(i-2)+2

 

 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=255; 6 int f1[maxn],f2[maxn]; 7 void add(int* a,int *b,int* c){ 8   memset(c,0,sizeof(c)); 9   int x=0;10   for(int i=1;i<maxn;i++){11     c[i]=a[i]+b[i]+x;12     x=c[i]/10;c[i]%=10;13   }14 }15 void del(int *a,int *b,int *c){//保证a>b16   memset(c,0,sizeof(c));17   for(int i=1;i<maxn;i++){18     if(a[i]<b[i]){19       a[i]+=10;20       a[i+1]--;21     }22     c[i]=a[i]-b[i];23   }24 }25 void g(){26   int t1[maxn],t2[maxn],t3[maxn],t4[maxn],t5[maxn];27   memset(t4,0,sizeof(t4));t4[1]=2;28   add(f1,f1,t1),add(t1,f1,t2);29   del(t2,f2,t3);add(t3,t4,t5);30   for(int i=1;i<maxn;i++) f2[i]=f1[i],f1[i]=t5[i];31 }32 void printAns(){33   for(int i=254;i>=1;i--){34     if(f1[i]==0) continue;35     for(int j=i;j>=1;j--){36       printf("%d",f1[j]);37     }break;38   }39 }40 void init(){41   memset(f1,0,sizeof(f1));42   memset(f2,0,sizeof(f2));43   f1[1]=5,f2[1]=1;44 }45 int main()46 {47   init();48   int p;scanf("%d",&p);49   for(int i=1;i<p-1;i++) g();50   printAns();51   return 0;52 }

//高精写的太丑了...然而这还是调了半天才对...

From Linux

 

BZOJ1002 轮状病毒