2485 - I
定义函数f(n)如下:
define mod 1000000007
int f(int n){
if(n<3) return n;
return (2f(n-1)+f(n-2)+3f(n-3))%mod;
}
求f(n)的值。
题目输入
多组数据,每组输入n (0<=n<10^123)
<br />
题目输出
输出f(n)的值
输入/输出样例
题目输入
0 2 3 10
题目输出
0 2 5 6497
C++解答
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> using namespace std; typedef long long LL; struct Matrix{ LL m[4][4]; }E,D; const LL mod=1000000007; void init(){ memset(E.m,0,sizeof(E.m)); for(int i=1;i<=3;i++) E.m[i][i]=1; } Matrix multi(Matrix A,Matrix B){ Matrix ans; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++){ ans.m[i][j]=0; for(int k=1;k<=3;k++) ans.m[i][j]=(ans.m[i][j]+A.m[i][k]*B.m[k][j])%mod; } return ans; } Matrix Pow(Matrix A,LL k){ Matrix ans=E; while(k){ if(k&1) k--,ans=multi(ans,A); else k/=2,A=multi(A,A); } return ans; } Matrix Pow(Matrix A,string n){ Matrix tmp=A,ans=E; for(int i=n.size()-1;i>=0;i--){ ans=multi(ans,Pow(tmp,(LL)n[i]-'0')); tmp=Pow(tmp,10); } return ans; } int main(){ /*freopen("in.txt","r",stdin); freopen("out.txt","w",stdout);*/ init(); memset(D.m,0,sizeof(D.m)); D.m[1][1]=2,D.m[1][2]=D.m[2][1]=D.m[3][2]=1,D.m[1][3]=3; string n; while(cin>>n){ if(n=="0"){ printf("0\n"); continue; } else if(n=="1"){ printf("1\n"); continue; } else{ int tp=2; for(int i=n.size()-1;tp!=0 && i>=0;i--){ if(n[i]-'0'>=tp){ n[i]=n[i]-tp; tp=0; } else{ n[i]=n[i]+10-tp; tp=1; } } } Matrix tmp; tmp.m[1][1]=2,tmp.m[2][1]=1,tmp.m[3][1]=0; printf("%lld\n",multi(Pow(D,n),tmp).m[1][1]); } return 0; }