bzoj1002轮状病毒
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于bzoj1002轮状病毒的主要内容,如果未能解决你的问题,请参考以下文章