1. 程式人生 > >bzoj1002輪狀病毒

bzoj1002輪狀病毒

ring 多少 idt ont color aps esp .com load

傳送門

Description

  輪狀病毒有很多變種,所有輪狀病毒的變種都是從一個輪狀基產生的。一個N輪狀基由圓環上N個不同的基原子
和圓心處一個核原子構成的,2個原子之間的邊表示這2個原子之間的信息通道。如下圖所示

技術分享圖片

  N輪狀病毒的產生規律是在一個N輪狀基中刪去若幹條邊,使得各原子之間有唯一的信息通道,例如共有16個不
同的3輪狀病毒,如下圖所示

技術分享圖片   現給定n(N<=100),編程計算有多少個不同的n輪狀病毒

Input

  第一行有1個正整數n

Output

  計算出的不同的n輪狀病毒數輸出

Sample Input

3

Sample Output

16

題解:

拿一張紙畫一下,發現有這樣一個關系式:f[i]=f[i-1]*3-f[i-2]+2。發現這樣到第100項一定會爆long long,因此用高精度。

代碼:

技術分享圖片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 using namespace std;
 8 struct node{
 9     int s[101];
10     int len;
11 }ans[110];
12 int n;
13 node mul(node a,int b){
14     int
i,j; 15 for(i=1;i<=a.len;++i){ 16 a.s[i]*=b; 17 } 18 for(i=1;i<=a.len;++i){ 19 a.s[i+1]+=a.s[i]/10; 20 a.s[i]%=10; 21 } 22 if(a.s[a.len+1]!=0) a.len++; 23 return a; 24 } 25 node miu(node a,node b){ 26 int i,j=1; 27 a.s[1]+=2; 28 while(a.s[j]>=10
){ 29 a.s[j]%=10;a.s[++j]++; 30 } 31 for(i=1;i<=a.len;++i){ 32 a.s[i]-=b.s[i]; 33 if(a.s[i]<0){ 34 a.s[i]+=10;a.s[i+1]--; 35 } 36 } 37 while(a.s[a.len]==0) a.len--; 38 return a; 39 } 40 int main(){ 41 scanf("%d",&n); 42 ans[1].s[1]=1;ans[0].s[1]=0; 43 ans[1].len=ans[0].len=1; 44 int i,j; 45 for(i=2;i<=n;++i){ 46 ans[i]=miu(mul(ans[i-1],3),ans[i-2]); 47 } 48 for(i=ans[n].len;i>=1;--i){ 49 printf("%d",ans[n].s[i]); 50 } 51 return 0; 52 }
bzoj1002

bzoj1002輪狀病毒