问题描述
//据说很多人的题目会有一大堆废话,本傻×就不在这里废话了。
就是叫你算A的B的C次方次方。
当然了,为了方便起见,把答案%1,000,000,007输出就好。
输入格式
一行,三个整数A,B,C,以空格隔开。
输出格式
输出A的B的C次方次方%1,000,000,007。
样例输入
3 4 5
样例输出
763327764
数据规模和约定
0≤A,B,C≤1,000,000,000
思路:
首先需要理解题目,是要先求出B的C次方,假设结果为D,再求出A的D次方。这里要用到快速幂,快速幂就是指数不断除2,底数不断平方,假设初始结果为1,当指数为奇数时,结果乘以此时的底数。由于(a*b)%c=(a%c*b%c)%c,所以我们只需要每次计算底数取模和每次计算结果取模就行了。这里还要用到一个费马小定理:若存在整数 a , p 且gcd(a,p)=1,即二者互为质数,则有a^(p-1)≡ 1(mod p)。这里的≡是恒等于的意思,我实在理解不来,只知道在求B的C次方时取模为MOD-1就可以了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const long long MOD=1000000007;
int main()
{
long long a,b,c;
cin>>a>>b>>c;
long long result=1,d=1;
while(c!=0)//先求出b的c次方,结果为d 。
{
if(c&1) d=d*b%(MOD-1);//注意根据费马小定理,这里取模为MOD-1,下面MOD-1同理。这里的c&1是判断奇偶。
c>>=1;//位运算,和c/=2同理。
b=b*b%(MOD-1);
}
while(d!=0)//再求出a的d次方 。
{
if(d&1) result=result*a%MOD;
d>>=1;
a=a*a%MOD;
}
cout<<result;
return 0;
}