Description

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

BZOJ1002 轮状病毒-LMLPHP

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

BZOJ1002 轮状病毒-LMLPHP

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

Input

  第一行有1个正整数n

Output

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

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

 #include<iostream>
 #include<cstring>
 #include<cstdio>
 using namespace std;
 ;
 int f1[maxn],f2[maxn];
 void add(int* a,int *b,int* c){
   memset(c,,sizeof(c));
   ;
   ;i<maxn;i++){
     c[i]=a[i]+b[i]+x;
     x=c[i]/;c[i]%=;
   }
 }
 void del(int *a,int *b,int *c){//保证a>b
   memset(c,,sizeof(c));
   ;i<maxn;i++){
     if(a[i]<b[i]){
       a[i]+=;
       a[i+]--;
     }
     c[i]=a[i]-b[i];
   }
 }
 void g(){
   int t1[maxn],t2[maxn],t3[maxn],t4[maxn],t5[maxn];
   memset(t4,,]=;
   add(f1,f1,t1),add(t1,f1,t2);
   del(t2,f2,t3);add(t3,t4,t5);
   ;i<maxn;i++) f2[i]=f1[i],f1[i]=t5[i];
 }
 void printAns(){
   ;i>=;i--){
     ) continue;
     ;j--){
       printf("%d",f1[j]);
     }break;
   }
 }
 void init(){
   memset(f1,,sizeof(f1));
   memset(f2,,sizeof(f2));
   f1[]=,f2[]=;
 }
 int main()
 {
   init();
   int p;scanf("%d",&p);
   ;i<p-;i++) g();
   printAns();
   ;
 }

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

From Linux

05-08 15:27