题目传送门
神题。
听说要用基尔霍夫矩阵了。
然而我并不知道那是什么东西。
看了看。膜了一发神牛。
真的强
然后上高精度。。
代码实现:
#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;
}
以后我要学!太神了。
应该是最小生成树计数吧。