BZOJ1002 轮状病毒
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>b 16 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 轮状病毒的主要内容,如果未能解决你的问题,请参考以下文章