BZOJ 1002 FJOI2007 轮状病毒

Posted zhangenming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1002 FJOI2007 轮状病毒相关的知识,希望对你有一定的参考价值。

1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 5960  Solved: 3251
[Submit][Status][Discuss]

Description

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

技术分享图片

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

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

 

Input

  第一行有1个正整数n

Output

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

Sample Input

3

Sample Output

16

HINT

 

Source

第n项公式f[n]=f[n-1]*3-f[n-2]+2,高精度求即可

技术分享图片
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 inline int read(){
 5     int x=0;int f=1;char ch=getchar();
 6     while(!isdigit(ch)) {if(ch==-) f=-1;ch=getchar();}
 7     while(isdigit(ch)) {x=x*10+ch-0;ch=getchar();}
 8     return x*f;
 9 }
10 struct bignum{
11     int len;
12     int num[1000];
13 }ans[110],k;
14 inline bignum operator * (bignum x,int y){
15     bignum z;
16     memset(&z,0,sizeof(z));
17     for(int i=1;i<=x.len;i++){
18             z.num[i]+=x.num[i]*y;
19             z.num[i+1]=z.num[i+1]+z.num[i]/10;
20             z.num[i]%=10;
21     }
22     z.len=x.len;
23     if(z.num[x.len+1]) z.len++;
24     return z;
25 }
26 inline void operator += (bignum &x,bignum y){
27     bignum z;
28     memset(&z,0,sizeof(z));
29     z.len=max(x.len,y.len);
30     for(int i=1;i<=z.len;i++){
31         z.num[i]+=x.num[i]+y.num[i];
32         if(z.num[i]>=10) z.num[i]-=10,z.num[i+1]++;
33     }
34     if(z.num[z.len+1]) z.len++;
35     x=z;
36 }
37 inline void operator -= (bignum &x,bignum y){
38     bignum z;
39     memset(&z,0,sizeof(z));
40     for(int i=1;i<=x.len;i++){
41         z.num[i]+=x.num[i]-y.num[i];
42         if(z.num[i]<0) z.num[i+1]--,z.num[i]+=10;
43     }
44     if(!z.num[x.len]) z.len=x.len-1;
45     else z.len=x.len;
46     x=z;
47 }
48 void print(bignum x){
49     for(int i=x.len;i>=1;i--){
50         cout<<x.num[i];
51     }
52     cout<<endl;
53 }
54 int main(){
55     int n=read();
56     ans[1].len=1;ans[1].num[1]=1;ans[2].len=1;ans[2].num[1]=5;
57     for(int i=3;i<=n;i++){
58         ans[i].len=1;ans[i].num[1]=2;
59         ans[i]+=ans[i-1]*3;
60         ans[i]-=ans[i-2];
61         
62     }
63     print(ans[n]);
64     return 0;
65 }
View Code

 





以上是关于BZOJ 1002 FJOI2007 轮状病毒的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1002 FJOI2007 轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒

BZOJ 1002 [FJOI2007]轮状病毒

BZOJ1002: [FJOI2007]轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒