bzoj1002: [FJOI2007]轮状病毒(基尔霍夫矩阵)

1002: [FJOI2007]轮状病毒

题目:传送门

 

题解:

   决定开始板刷的第一题...

   看到这题的时候想:这不就是求有多少种最小生成树的方式吗?

   不会啊!!!%题解。。。

   什么鬼?基尔霍夫矩阵????OTZ...

   什么叫基尔霍夫矩阵就自己去学吧,博主太菜也不会啊...

   总之答案就是递归出来的:F(n)=3*F(n-1)-F(n-2)+2

   在码个高精度就莫名其妙的A了...真的是毒瘤...

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 struct node
 8 {
 9     int a[110],len;
10 }f[110];
11 node chengfa(node x,int k)
12 {
13     for(int i=1;i<=x.len;i++)x.a[i]*=k;
14     for(int i=1;i<=x.len;i++)
15     {
16         x.a[i+1]+=x.a[i]/10;
17         x.a[i]%=10;
18     }
19     while(x.a[x.len+1]!=0)x.len++;
20     return x;
21 }
22 node jianfa(node x,node y)
23 {
24     x.a[1]+=2;
25     int j=1;while(x.a[j]>=10){x.a[j]%=10;x.a[++j]++;}
26     for(int i=1;i<=x.len;i++)
27     {
28         x.a[i]-=y.a[i];
29         if(x.a[i]<0)
30         {
31             x.a[i]+=10;
32             x.a[i+1]--;
33         }
34     }
35     while(x.a[x.len]==0)x.len--;
36     return x;
37 }
38 int n;
39 int main()
40 {
41     f[1].a[1]=1;f[2].a[1]=5;
42     f[1].len=f[2].len=1;
43     scanf("%d",&n);
44     for(int i=3;i<=n;i++)f[i]=jianfa(chengfa(f[i-1],3),f[i-2]);
45     for(int i=f[n].len;i>=1;i--)printf("%d",f[n].a[i]);
46     return 0;
47 }

 

posted @ 2017-12-30 15:31  CHerish_OI  阅读(348)  评论(0编辑  收藏  举报