【hdu 4549】 M斐波那契数列

Problem Description
M斐波那契数列F[n]是一种整数数列,它的定义如下:

F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )

现在给出a, b, n,你能求出F[n]的值吗?
 

Input
输入包含多组测试数据;
每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
 

Output
对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
 

Sample Input
 
  
0 1 0
6 10 2
 
Sample Output
 
  
0
60
 

Source
 

这道题是一个矩阵快速幂+费马小定理降幂,首先设Fibonacci数列第n项为fib[n],可以推出F[n]=a^fib[n-1]*b^fib[n],然后用矩阵快速幂求fib[n-1]和fib[n],再根据费马小定理得到当a,p互质时a^b%p=a^(b%p)%p,这样就可以直接快速幂解决了,下面是程序:
[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. #include<iostream>  
  3. #define ll long long  
  4. using namespace std;  
  5. struct node{  
  6.     ll x[2][2];  
  7.     node(){  
  8.         x[0][0]=0;  
  9.         x[0][1]=x[1][0]=x[1][1]=1;  
  10.     }  
  11. };  
  12. node mul(node &a,node &b,ll &mod){  
  13.     node s;  
  14.     int i,j,k;  
  15.     for(i=0;i<2;i++){  
  16.         for(j=0;j<2;j++){  
  17.             s.x[i][j]=0;  
  18.             for(k=0;k<2;k++){  
  19.                 s.x[i][j]+=a.x[i][k]*b.x[k][j];  
  20.                 s.x[i][j]%=mod;  
  21.             }  
  22.         }  
  23.     }  
  24.     return s;  
  25. }  
  26. node fib(ll n,ll mod){  
  27.     node s,r;  
  28.     s.x[0][0]=s.x[1][1]=1;  
  29.     s.x[1][0]=s.x[0][1]=0;  
  30.     while(n){  
  31.         if(n&1){  
  32.             s=mul(s,r,mod);  
  33.         }  
  34.         r=mul(r,r,mod);  
  35.         n>>=1;  
  36.     }  
  37.     return s;  
  38. }  
  39. ll pow(ll a,ll b,ll p){  
  40.     ll s=1,r=a;  
  41.     while(b){  
  42.         if(b&1){  
  43.             s*=r;  
  44.             s%=p;  
  45.         }  
  46.         r*=r;  
  47.         r%=p;  
  48.         b>>=1;  
  49.     }  
  50.     return s;  
  51. }  
  52. int main(){  
  53.     ll a,b,n;  
  54.     const ll mod=1000000007;  
  55.     while(~scanf("%lld%lld%lld",&a,&b,&n)){  
  56.         node s=fib(n,mod-1);  
  57.         printf("%lld\n",(pow(a,s.x[0][0],mod)*pow(b,s.x[0][1],mod))%mod);  
  58.     }  
  59.     return 0;  
  60. }  

猜你喜欢

转载自blog.csdn.net/jialiang2509/article/details/80382371