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 }