轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示
N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示
现给定n(N<=100),编程计算有多少个不同的n轮状病毒
标签:git gif fine tput none 分享 time efi inline
轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示
N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示
第一行有1个正整数n
计算出的不同的n轮状病毒数输出
第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 }
标签:git gif fine tput none 分享 time efi inline
原文地址:http://www.cnblogs.com/something-for-nothing/p/7979242.html