直接用上规律:f[n]=f[n-1]*3+2-f[n-2]
注意要用高精度,证明要用到基尔霍夫矩阵,而蒟蒻我不会。
#include<cstdio>
#include<cstdlib>
#include<cstring>
int f[105][105];
int L[105];
int main()
{
int n;
f[1][0]=1;L[1]=1;
f[2][0]=5;L[2]=1;
scanf("%d",&n);
for (int i=3;i<=n;i++)
{
//f[i]=3*f[i-1]-f[i-2]+2;
for (int j=0;j<L[i-1];j++)
f[i][j]=f[i-1][j];
L[i]=L[i-1];
for (int j=0;j<L[i];j++)
f[i][j]*=3;
for (int j=0;j<L[i];j++)
{
f[i][j+1]+=f[i][j]/10;
f[i][j]%=10;
}
while(f[i][L[i]]>0)
{f[i][L[i]+1]+=f[i][L[i]]/10;f[i][L[i]]%=10;L[i]++;}
f[i][0]+=2;
for (int j=0;j<L[i];j++)
{
if (f[i][j]<10)break;
f[i][j+1]++;
f[i][j]-=10;
}
while (f[i][L[i]]>0)
{f[i][L[i]+1]+=f[i][L[i]]/10;f[i][L[i]]%=10;L[i]++;}
for (int j=0;j<L[i];j++)
f[i][j]-=f[i-2][j];
for (int j=0;j<L[i];j++)
{
if (f[i][j]<0)
{
f[i][j+1]--;
f[i][j]+=10;
}
}
while(f[i][L[i]-1]==0)L[i]--;
}
for (int j=L[n]-1;j>=0;j--)
printf("%d",f[n][j]);
}