1002: [FJOI2007]轮状病毒
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5803 Solved: 3154
[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
我承认我承认……这题是在路边沾花惹草遇到的……因为看到那个递推的式子极其的简单所以就写了 _(:зゝ∠)_ 对了这貌似是我第一次写高精度减法 *▽*
http://blog.csdn.net/Clove_unique/article/details/51438878
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=105; 5 int n; 6 struct Node{ 7 int a[505]; 8 Node (){memset(a,0,sizeof(a));} 9 Node operator * (const Node tt) { 10 int i,j,k; 11 Node an;an.a[0]=a[0]+tt.a[0]; 12 for (i=1;i<=a[0];i++){ 13 for (j=1;j<=tt.a[0];j++){ 14 an.a[i+j-1]+=a[i]*tt.a[j]; 15 an.a[i+j]+=an.a[i+j-1]/10; 16 an.a[i+j-1]%=10; 17 } 18 } 19 while (an.a[an.a[0]]==0) an.a[0]--; 20 return an; 21 } 22 Node operator + (const Node &tt) { 23 int i,j; 24 Node an;an.a[0]=max(a[0],tt.a[0])+1; 25 for (i=1;i<=max(a[0],tt.a[0]);i++){ 26 an.a[i]+=a[i]+tt.a[i]; 27 an.a[i+1]+=an.a[i]/10; 28 an.a[i]%=10; 29 } 30 while (an.a[an.a[0]]==0) an.a[0]--; 31 return an; 32 } 33 Node operator - (const Node &tt) { 34 int i,j; 35 Node an;an.a[0]=a[0]; 36 for (i=1;i<=a[0];i++){ 37 if (a[i]<tt.a[i]) a[i+1]--,a[i]+=10; 38 an.a[i]=a[i]-tt.a[i]; 39 } 40 while (an.a[an.a[0]]==0) an.a[0]--; 41 return an; 42 } 43 }f[MAX]; 44 int main(){ 45 freopen ("virus.in","r",stdin); 46 freopen ("virus.out","w",stdout); 47 int i,j; 48 scanf("%d",&n); 49 f[1].a[0]=f[1].a[1]=f[2].a[0]=1;f[2].a[1]=5; 50 Node x;x.a[0]=1,x.a[1]=2; 51 Node y;y.a[0]=1,y.a[1]=3; 52 for (i=3;i<=n;i++) 53 f[i]=f[i-1]*y-f[i-2]+x; 54 for (i=f[n].a[0];i>0;i--) 55 printf("%d",f[n].a[i]); 56 return 0; 57 }
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》