用基尔霍夫矩阵推出f[i]=(f[i-1]*3-f[i-2]+2);用高精度即可。
看这个吧。。http://vfleaking.blog.163.com/blog/static/17480763420119685112649/
#include <cstdio>
using namespace std;
struct Big_num{
int len,a[102];
};
Big_num f[102];
int n;
Big_num mul(Big_num a)
{
register int i;
for (i=1;i<=a.len;i++)
{
a.a[i]*=3;
}
for (i=1;i<=a.len;i++)
{
a.a[i+1]+=a.a[i]/10;
a.a[i]%=10;
}
if(a.a[a.len+1]!=0) a.len++;
return a;
}
Big_num add(Big_num a,Big_num b)
{
a.a[1]+=2;
register int i=1;
while (a.a[i]>=10) a.a[i++]%=10,a.a[i]++;
for (i=1;i<=a.len;i++)
{
a.a[i]-=b.a[i];
if (a.a[i]<0) a.a[i]+=10,a.a[i+1]--;
}
while(a.a[a.len]==0) a.len--;
return a;
}
int main()
{
register int i;
scanf("%d",&n);
f[1].a[1]=1;f[2].a[1]=5;
f[1].len=f[2].len=1;
for (i=3;i<=n;i++)
{
f[i]=add(mul(f[i-1]),f[i-2]);
}
for (i=f[n].len;i>=1;i--)
{
printf("%d",f[n].a[i]);
}
return 0;
}