求 a 的 b 次方对 p 取模的值。
输入格式
三个整数 a,b,p ,同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p
的值。
数据范围
0≤a,b≤10^9
1≤p≤10^9
输入样例:
3 2 7
输出样例:
2
普通的计算 a的b次方 需要进行b次循环 把b个a相乘
而快速幂的思想是:
例子:3 7 2 3的七次方 对2去模
7的二进制表示为111
3^1=3 3^2=9 3^4=81
3的7次方 可以分为上面三个式子相乘
我们只需要设定一个结果 把7的二进制形式的个位 依次乘以结果再对2取余
`#include<iostream>
using namespace std;
int main()
{
long long a,b,p,res=1%p;
scanf("%ld%ld%ld",&a,&b,&p);
//循环的条件是b不为0
//b对应的二进制数位上的数字是1的 就把a对应的次方乘进去 再mod p
while(b)
{
//如果b的个位数字为1 结果就乘以当前a的值再modp 一直modp 和结果再mod p 产出的结果一样 且数据便于计算
if(b&1) res=res*a%p;
b>>=1;//b右移了一位后,a也需要更新
a=a*a%p;//a再取对于对应二进制数位上表示的值 如 7 111 a依次表示每一位1所代表的值
}
printf("%ld\n",res%p);
}