bzoj1002

直接用上规律: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]);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值