0 1 2
0 1 42837
题意:
解题思路:依据g(n)的计算公式,计算g(g(g(n)))%10^9+7;
AC代码:主要的方法就是求出循环节。然后处理的时候就是用矩阵快速幂。注意快速幂的指数的大小
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; typedef long long LL; const int MAXN = 2; int Mod1=1000000007; int Mod2=222222224; int Mod3=183120; LL g[MAXN][MAXN]; void multiply(LL x[MAXN][MAXN],LL y[MAXN][MAXN],LL Mod) { LL t[MAXN][MAXN]={0}; for(int i=0;i<MAXN;i++){ for(int k=0;k<MAXN;k++){ if(x[i][k]){ for(int j=0;j<MAXN;j++){ t[i][j]=(t[i][j]+x[i][k]*y[k][j])%Mod; } } } } for(int i=0;i<MAXN;i++){ for(int j=0;j<MAXN;j++){ x[i][j]=t[i][j]; } } } void Matrix(LL x[MAXN][MAXN],LL n,LL Mod) { LL res[MAXN][MAXN]; for(int i=0;i<MAXN;i++){ for(int j=0;j<MAXN;j++){ if(i==j) res[i][j]=1; else res[i][j]=0; } } while(n){ if(n&1) multiply(res,x,Mod); multiply(x,x,Mod); n>>=1; } for(int i=0;i<MAXN;i++){ for(int j=0;j<MAXN;j++){ x[i][j]=res[i][j]; } } } //暴力求 Mod n的循环节a=3,b=1,c=1,d=3,n; void circular_section(LL a,LL b,LL c,LL d,LL n) { LL x=c,y=d,t; LL i=1; while(i){ if(i>20*n){ printf("-1\n"); return; } t=a*d+b*c; t%=n; c=d; d=t; if(c==x&&d==y){ printf("%lld\n",i); return; } i++; } } void solve(LL n) { LL f[MAXN],t; f[0]=1;f[1]=0; g[0][0]=3;g[0][1]=1; g[1][0]=1;g[1][1]=0; Matrix(g,n,Mod3); LL temp=0; for(int i=0;i<MAXN;i++){ temp=(temp+f[i]*g[i][1])%Mod3; } g[0][0]=3;g[0][1]=1; g[1][0]=1;g[1][1]=0; Matrix(g,temp,Mod2); temp=0; for(int i=0;i<MAXN;i++){ temp=(temp+f[i]*g[i][1])%Mod2; } g[0][0]=3;g[0][1]=1; g[1][0]=1;g[1][1]=0; Matrix(g,temp,Mod1); temp=0; for(int i=0;i<MAXN;i++){ temp=(temp+f[i]*g[i][1])%Mod1; } printf("%lld\n",temp); } int main() { LL n; while(scanf("%lld",&n)!=EOF){ if(n==0)printf("0\n"); else if(n==1) printf("1\n"); else solve(n); } return 0; }