HDU 4549 M斐波那契数列

数论:当gcd(x,m)=1时,x^(m-1) mod m=1,

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int mod = 1000000006;
const int mod1= 1000000007;
struct node
{
    long long a,b,c,d;
}org;
node pows(int m)//n^m
{
    node ans,tmp;
    ans.a=1;ans.b=0;ans.c=0;ans.d=1;
    if(m>1)
    {
        tmp=pows(m>>1);
        ans.a=(tmp.a*tmp.a+tmp.b*tmp.c)%mod;
        ans.b=(tmp.a*tmp.b+tmp.b*tmp.d)%mod;
        ans.c=(tmp.c*tmp.a+tmp.d*tmp.c)%mod;
        ans.d=(tmp.c*tmp.b+tmp.d*tmp.d)%mod;
    }
    tmp=ans;
    if(m&1)
    {
        tmp.a=(ans.a*org.a+ans.b*org.c)%mod;
        tmp.b=(ans.a*org.b+ans.b*org.d)%mod;
        tmp.c=(ans.c*org.a+ans.d*org.c)%mod;
        tmp.d=(ans.c*org.b+ans.d*org.d)%mod;
    }
    return ans=tmp;
}
long long  re_pows(int a,int n)//递归快速乘幂
{
    if(n==0) return 1;
    long long t=re_pows(a,n>>1);
    long long ans=(t*t)%mod1;
    if(n&1) ans=(ans*a)%mod1;
    return ans;
}
int main()
{
    int a,b,m;
    org.a=0;org.b=1;
    org.c=1;org.d=1;
    while(cin>>a>>b>>m)
    {
        node tmp=pows(m);
        long long ans;
        ans=re_pows(a,tmp.a);
        ans=(ans*re_pows(b,tmp.b))%mod1;
        cout<<ans<<endl;
    }
    return 0;
}
View Code

 

posted @ 2013-05-19 15:18  qijinbiao1  阅读(682)  评论(0编辑  收藏  举报