题意:
M斐波那契数列F[n]是一种整数数列,它的定义如下:
F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )
现在给出a, b, n,你能求出F[n]的值吗?
链接:点我
这题的话,看a ,b 的指数,刚好可以使用斐波那契数列求解。
然后用矩阵做。
A^B %C 这题的C是质素,而且A,C是互质的。
所以直接A^(B%(C-1)) %C
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 #define pb(a) push_back(a) 11 const int INF=0x3f3f3f3f; 12 const double eps=1e-5; 13 typedef long long ll; 14 #define cl(a) memset(a,0,sizeof(a)) 15 #define ts printf("*****\n"); 16 const int MAXN=30010; 17 int n,m,tt,cnt; 18 struct Matrix 19 { 20 long long mat[2][2]; 21 }; 22 Matrix mul(Matrix a,Matrix b) 23 { 24 Matrix ret; 25 for(int i=0;i<2;i++) 26 for(int j=0;j<2;j++) 27 { 28 ret.mat[i][j]=0; 29 for(int k=0;k<2;k++) 30 { 31 ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; 32 ret.mat[i][j]%=(MOD-1); 33 } 34 } 35 return ret; 36 } 37 Matrix pow_M(Matrix a,int n) 38 { 39 Matrix ret; 40 memset(ret.mat,0,sizeof(ret.mat)); 41 ret.mat[0][0]=ret.mat[1][1]=1; 42 Matrix temp=a; 43 while(n) 44 { 45 if(n&1)ret=mul(ret,temp); 46 temp=mul(temp,temp); 47 n>>=1; 48 } 49 return ret; 50 } 51 long long pow_m(long long a,long long n) 52 { 53 long long ret=1; 54 long long temp=a%MOD; 55 while(n) 56 { 57 if(n&1) 58 { 59 ret*=temp; 60 ret%=MOD; 61 } 62 temp*=temp; 63 temp%=MOD; 64 n>>=1; 65 } 66 return ret; 67 } 68 int main() 69 { 70 int i,j,k; 71 #ifndef ONLINE_JUDGE 72 freopen("1.in","r",stdin); 73 #endif 74 int a,b; 75 Matrix aa; 76 aa.mat[0][0]=0; 77 aa.mat[0][1]=aa.mat[1][0]=aa.mat[1][1]=1; 78 while(~scanf("%d%d%d",&a,&b,&n)) 79 { 80 Matrix bb=pow_M(aa,n); 81 int ans=(pow_m(a,bb.mat[0][0])*pow_m(b,bb.mat[1][0]))%MOD; 82 printf("%d\n",ans); 83 } 84 }
时间: 2024-11-08 22:27:07