bzoj1002輪狀病毒
阿新 • • 發佈:2018-02-25
ring 多少 idt ont color aps esp .com load
傳送門
Description
輪狀病毒有很多變種,所有輪狀病毒的變種都是從一個輪狀基產生的。一個N輪狀基由圓環上N個不同的基原子
和圓心處一個核原子構成的,2個原子之間的邊表示這2個原子之間的信息通道。如下圖所示
N輪狀病毒的產生規律是在一個N輪狀基中刪去若幹條邊,使得各原子之間有唯一的信息通道,例如共有16個不
同的3輪狀病毒,如下圖所示
Input
第一行有1個正整數n
Output
計算出的不同的n輪狀病毒數輸出
Sample Input
3Sample 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 intbzoj1002i,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輪狀病毒