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;
}

时间限制 5 秒
内存限制 128 MB
讨论 统计
上一题 下一题