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

1002: [FJOI2007]轮状病毒

题目:传送门

题解:

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

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

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

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

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

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

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

代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int a[],len;
}f[];
node chengfa(node x,int k)
{
for(int i=;i<=x.len;i++)x.a[i]*=k;
for(int i=;i<=x.len;i++)
{
x.a[i+]+=x.a[i]/;
x.a[i]%=;
}
while(x.a[x.len+]!=)x.len++;
return x;
}
node jianfa(node x,node y)
{
x.a[]+=;
int j=;while(x.a[j]>=){x.a[j]%=;x.a[++j]++;}
for(int i=;i<=x.len;i++)
{
x.a[i]-=y.a[i];
if(x.a[i]<)
{
x.a[i]+=;
x.a[i+]--;
}
}
while(x.a[x.len]==)x.len--;
return x;
}
int n;
int main()
{
f[].a[]=;f[].a[]=;
f[].len=f[].len=;
scanf("%d",&n);
for(int i=;i<=n;i++)f[i]=jianfa(chengfa(f[i-],),f[i-]);
for(int i=f[n].len;i>=;i--)printf("%d",f[n].a[i]);
return ;
}
上一篇:BZOJ1002:[FJOI2007]轮状病毒(找规律,递推)


下一篇:C++ 简单的控制台贪吃蛇小游戏