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; }