题意:
你会发现a和b的指数变化就是斐波那契数列,再结合费马小定理,定理应用到这一题就是可以将(A^B)%mod = (A^(B % mod ) )% mod)。
注意:用 long long防止数据溢出,最后a,b相乘之后要再取一次模。
#include
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
const int mo = 1e9 + 6;
struct node{
ll m[2][2];
};
node cmp(node a, node b){
node te;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++){
te.m[i][j]=0;
for(int k = 0; k< 2; k++){
te.m[i][j] += a.m[i][k] * b.m[k][j];//;long long防止数据溢出
te.m[i][j] %= mo;
}
}
return te;
}
node powermod(int n){
node ans,base;
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
base.m[1][1] = 0;
ans.m[0][0] = ans.m[1][1] = 1;// ans 初始化为单位矩阵
ans.m[0][1] = ans.m[1][0] = 0;
while(n){
if(n&1) ans = cmp(ans, base);
n >>= 1;
base=cmp(base, base);
}
return ans;
}
ll powermod_2(ll a,ll b ,ll c){
ll ans= 1;
a = a % c;
while(b>0){
if(b%2) ans = (ans * a) %c;
b = b/2;
a = (a * a)%c; //若a不为long long溢出
}
return ans;
}
int main(){
int a,b,n;
node te;
while(scanf("%d%d%d",&a,&b,&n)!= EOF){
te = powermod(n);
ll tt=powermod_2(a,te.m[1][1],1e9+7)*powermod_2(b,te.m[1][0],1e9+7);
printf("%I64d\n",tt%(mo+1));//忘了再取余一次导致wa
}
return 0;
}