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

 

你可能感兴趣的:(HDU)