首页 > 代码库 > 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 轮状病毒
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。