首页 > 代码库 > bzoj1002轮状病毒

bzoj1002轮状病毒

这题正解基尔霍夫矩阵(本蒟蒻不会)

于是就找规律吧。

前7项答案为

1 5 16 45 121 320 841

其实可以看成

1*1  3*3-4  4*4  7*7-4  11*11  18*18-4  29*29

4=3+1,7=4+3,11=7+4...

就是一个Fibonacci 第一项为1,第二项为3

F[n]=f(n)^2-4*(1-n%2);

再加个高精度就完了。

 (Ps:懒得打高精度减了,直接减了4)

技术分享
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 const int mod=10000;
 6 int n;
 7 struct Bign {
 8     int len,s[105];
 9     Bign() {
10         memset(s,0,sizeof(s));
11         len=1;
12     }
13     void Zore() {
14         while (len&&!s[len]) len--;
15     }
16     void print() {
17         if (!(n&1)) s[1]-=4;
18         printf("%d",s[len]);
19         for (int i=len-1;i;i--) printf("%04d",s[i]);
20     }
21 }f[105],x;
22 
23 Bign add(Bign a,Bign b) {
24     for (int i=1;i<=b.len;i++) b.s[i]+=a.s[i];
25     for (int i=1;i<=b.len;i++) b.s[i+1]+=b.s[i]/mod,b.s[i]%=mod;
26     while (b.s[b.len+1]) ++b.len;
27     return b;
28 }
29 Bign mul(Bign a,Bign b) {
30     Bign c;c.len=a.len+b.len+2;
31     for (int i=1;i<=b.len;i++)
32         for (int j=1;j<=a.len;j++)
33             c.s[i+j-1]+=a.s[i]*b.s[j];
34     for (int i=1;i<=c.len;i++) c.s[i+1]+=c.s[i]/mod,c.s[i]%=mod;
35     while (c.s[c.len+1]) ++c.len;
36     c.Zore();
37     return c;
38 }
39 
40 int main()
41 {
42     scanf("%d",&n);
43     f[1].s[1]=1;f[1].len=1;f[2].s[1]=3;f[2].len=1;
44     for (int i=3;i<=n;i++) f[i]=add(f[i-2],f[i-1]);
45     x=mul(f[n],f[n]);
46     x.print();    
47     return 0;
48 }
View Code

 

bzoj1002轮状病毒