51nod 1358 浮波那契

来源:互联网 发布:java简单记事本源代码 编辑:程序博客网 时间:2024/04/29 19:11
构造新数列f(n)=f(n-10)+f(n-34),n>40,f(n)=1,n<=40,则FB(n)=f(10n)#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define LL long longconst int p=1e9+7;struct Matrix{    LL a[35][35];    Matrix(){memset(a,0,sizeof a);}    Matrix operator*(const Matrix &m)    {        Matrix res;        for(int i=0;i<35;i++)        {            for(int j=0;j<35;j++)            {                for(int k=0;k<35;k++)                {                    res.a[i][j]+=a[i][k]*m.a[k][j]%p;                }                res.a[i][j]%=p;            }        }        return res;    }}ans,base;Matrix pow(Matrix base,LL n){    Matrix res;    for(int i=0;i<35;i++) res.a[i][i]=1;    while(n)    {        if(n&1) res=res*base;        base=base*base;        n>>=1;    }    return res;}int main(){    LL n;    while(~scanf("%lld",&n))    {        if(n<=4) puts("1");        else        {            for(int i=0;i<35;i++) ans.a[0][i]=1;            base.a[9][0]=1,base.a[33][0]=1;            for(int i=1;i<35;i++) base.a[i-1][i]=1;            ans=ans*pow(base,10*n-40);            printf("%lld\n",(ans.a[0][0]+p)%p);        }    }    return 0;}


0 0
原创粉丝点击