您的位置:首页 > 其它

bzoj1002: [FJOI2007]轮状病毒

2017-09-24 16:19 513 查看
题目传送门

神题。

听说要用基尔霍夫矩阵了。

然而我并不知道那是什么东西。

看了看。膜了一发神牛。

真的强

然后上高精度。。

代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct node {
int len,a[11000];
node() {
len=0;
memset(a,0,sizeof(a));
}
};
node chengfa(node n1,int x) {
node no;
no.len=n1.len;
for(int i=1;i<=no.len;i++)
no.a[i]=n1.a[i]*x;
for(int i=1;i<=no.len;i++) {
no.a[i+1]+=no.a[i]/10;
no.a[i]%=10;
}
int i=no.len;
while(no.a[i+1]>0) {
i++;
no.a[i+1]+=no.a[i]/10;
no.a[i]%=10;
}
no.len=i;
return no;
}
node jianfa(node n1,node n2) {
node no;
no.len=max(n1.len,n2.len);
for(int i=1;i<=no.len;i++)
no.a[i]=n1.a[i]-n2.a[i];
for(int i=1;i<=no.len;i++)
if(no.a[i]<0) {
no.a[i]+=10;
no.a[i+1]--;
}
int i=no.len;
while(i>1&&no.a[i]==0)
i--;
no.len=i;
return no;
}
node jiafa(node n1,int x) {
node no=n1;
no.a[1]+=x;
for(int i=1;i<=no.len;i++) {
no.a[i+1]+=no.a[i]/10;
no.a[i]%=10;
}
int i=no.len;
while(no.a[i+1]>0) {
i++;
no.a[i+1]+=no.a[i]/10;
no.a[i]%=10;
}
no.len=i;
return no;
}
int main() {
int n;scanf("%d",&n);
node s1,s2,s3;
s1.len=1;s1.a[1]=1;
s2.len=1;s2.a[1]=5;
for(int i=3;i<=n;i++) {
s3=chengfa(s2,3);
s3=jianfa(s3,s1);
s3=jiafa(s3,2);
s1=s2;s2=s3;
}
for(int i=s3.len;i>=1;i--)
printf("%d",s3.a[i]);
printf("\n");
return 0;
}


以后我要学!太神了。

应该是最小生成树计数吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: