由题意可以求得f(n)=2*f(n-2)+f(n-1)+1,之后构建矩阵用矩阵二分幂就可以解决了。。。。。。。题目:
1 4 0
1 10
#include <iostream> #include <cstdio> using namespace std; const int M=200907; _int64 matrix[3][3]; void init(){ matrix[0][0]=0;matrix[0][1]=2;matrix[0][2]=0; matrix[1][0]=1;matrix[1][1]=1;matrix[1][2]=0; matrix[2][0]=0;matrix[2][1]=1;matrix[2][2]=1; } void matrixmi(int x){ _int64 x1,y1,z1,x2,y2,z2,x3,y3,z3; x1=(((matrix[0][0]%M)*(matrix[0][0]%M))%M+((matrix[0][1]%M)*(matrix[1][0]%M))%M+((matrix[0][2]%M)*(matrix[2][0]%M))%M)%M; y1=(((matrix[0][0]%M)*(matrix[0][1]%M))%M+((matrix[0][1]%M)*(matrix[1][1]%M))%M+((matrix[0][2]%M)*(matrix[2][1]%M))%M)%M; z1=(((matrix[0][0]%M)*(matrix[0][2]%M))%M+((matrix[0][1]%M)*(matrix[1][2]%M))%M+((matrix[0][2]%M)*(matrix[2][2]%M))%M)%M; x2=(((matrix[1][0]%M)*(matrix[0][0]%M))%M+((matrix[1][1]%M)*(matrix[1][0]%M))%M+((matrix[1][2]%M)*(matrix[2][0]%M))%M)%M; y2=(((matrix[1][0]%M)*(matrix[0][1]%M))%M+((matrix[1][1]%M)*(matrix[1][1]%M))%M+((matrix[1][2]%M)*(matrix[2][1]%M))%M)%M; z2=(((matrix[1][0]%M)*(matrix[0][2]%M))%M+((matrix[1][1]%M)*(matrix[1][2]%M))%M+((matrix[1][2]%M)*(matrix[2][2]%M))%M)%M; x3=(((matrix[2][0]%M)*(matrix[0][0]%M))%M+((matrix[2][1]%M)*(matrix[1][0]%M))%M+((matrix[2][2]%M)*(matrix[2][0]%M))%M)%M; y3=(((matrix[2][0]%M)*(matrix[0][1]%M))%M+((matrix[2][1]%M)*(matrix[1][1]%M))%M+((matrix[2][2]%M)*(matrix[2][1]%M))%M)%M; z3=(((matrix[2][0]%M)*(matrix[0][2]%M))%M+((matrix[2][1]%M)*(matrix[1][2]%M))%M+((matrix[2][2]%M)*(matrix[2][2]%M))%M)%M; matrix[0][0]=x1%M;matrix[0][1]=y1%M;matrix[0][2]=z1%M;matrix[1][0]=x2%M; matrix[1][1]=y2%M;matrix[1][2]=z2%M;matrix[2][0]=x3%M;matrix[2][1]=y3%M;matrix[2][2]=z3%M; if(x){ x1=(2*(matrix[1][0]%M))%M;y1=(2*(matrix[1][1]%M))%M;z1=(2*(matrix[1][2]%M))%M; x2=((matrix[0][0]%M)+(matrix[1][0]%M))%M;y2=((matrix[0][1]%M)+(matrix[1][1]%M))%M;z2=((matrix[0][2]%M)+(matrix[1][2]%M))%M; x3=((matrix[1][0]%M)+(matrix[2][0]%M))%M;y3=((matrix[1][1]%M)+(matrix[2][1]%M))%M;z3=((matrix[1][2]%M)+(matrix[2][2]%M))%M; matrix[0][0]=x1%M;matrix[0][1]=y1%M;matrix[0][2]=z1%M;matrix[1][0]=x2%M;matrix[1][1]=y2%M;matrix[1][2]=z2%M; matrix[2][0]=x3%M;matrix[2][1]=y3%M;matrix[2][2]=z3%M; } matrix[0][0]%=M;matrix[0][1]%=M;matrix[0][2]%=M;matrix[1][0]%=M;matrix[1][1]%=M;matrix[1][2]%=M; matrix[2][0]%=M;matrix[2][1]%=M;matrix[2][2]%=M; } void dfs(int n){ if(n==1){ return; } dfs(n/2); if(n%2) matrixmi(1); else matrixmi(0); } int main(){ _int64 n; while(scanf("%I64d",&n),n){ init(); if(n==1) printf("1\n"); else if(n==2) printf("2\n"); else{ n-=2; dfs(n); _int64 x=((matrix[0][1]%M)+2*(matrix[1][1]%M)%M+(matrix[2][1]%M))%M; printf("%I64d\n",x); } } return 0; }