BZOJ-1002: [FJOI2007]轮状病毒(打表找规律or递推 + 高精度)

1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 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 }
未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
原文地址:https://www.cnblogs.com/keximeiruguo/p/7695726.html