题目:
LINK
分析:
基尔霍夫矩阵, 生成树计数, 通过行列式找出递归关系就好了
Code:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
struct BigInt {
vector<ll> Num;
BigInt() {
Num.clear();
}
BigInt operator * (const ll a) {
BigInt ret;
int Max = Num.size();
for(int i = 0; i < Max; ++i)
ret.Num.push_back(Num[i] * a);
for(int i = 0; i < Max; ++i) {
if(ret.Num[i] >= 10) {
ll k = ret.Num[i] / 10;
if(i == Max-1) {
ret.Num.push_back(k);
}
else ret.Num[i+1] += k;
ret.Num[i] %= 10;
}
}
return ret;
}
BigInt operator - (const BigInt a) {
BigInt ret;
int loop = min(a.Num.size(), Num.size());
for(int i = 0; i < loop; ++i) ret.Num.push_back(Num[i]-a.Num[i]);
for(int i = loop; i < a.Num.size(); ++i)
ret.Num.push_back(-a.Num[i]);
for(int i = loop; i < Num.size(); ++i)
ret.Num.push_back(Num[i]);
int Max = ret.Num.size();
ret.Num[0] += 2;
for(int i = 0; i < Max; ++i) {
if(ret.Num[i] < 0) {
ret.Num[i] += 10;
if(i == Max-1) ret.Num.push_back(-1LL);
else ret.Num[i+1]--;
}
}
return ret;
}
void Print() {
int Max = Num.size();
for(int i = Max-1; i >= 0; --i) cout << Num[i];
cout << "\n";
}
void Set(ll n) {
Num.push_back(n);
}
};
BigInt N[101];
int main() {
N[0].Set(0LL);
N[1].Set(1LL);
N[2].Set(5LL);
for(int i = 3; i <= 100; ++i)
N[i] = N[i-1]*3 - N[i-2];
int n;
scanf("%d",&n);
N[n].Print();
return 0;
}