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 轮状病毒的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1002 FJOI2007 轮状病毒

BZOJ 1002 [FJOI2007]轮状病毒

[bzoj1002]轮状病毒

BZOJ1002: [FJOI2007]轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒