题目描述:
给定 A, B, P,求(A^B) mod P。
输入格式
输入共一行。
第一行有三个数,N, M, P。
输出格式
输出共一行,表示所求。
样例输入
2 5 3
样例输出
2
数据规模和约定
共10组数据
对100%的数据,A, B为long long范围内的非负整数,P为int内的非负整数。
思路解析:
在离散数学中学过公式:( ab ) mod c = ( a mod c )b mod c;
-
题目要求求( a b) mod p,可以将其拆分为 ( ( a2 )b/2 ) mod p;
-
由上面公式可以得出: ( ( a2 )b/2 ) mod p = ( ( a2 mod p )b/2 ) mod p
-
如果 b 为偶数: ( a b ) mod p=( ( ( a2) mod p )b/2) mod p;
-
如果 b 为奇数: ( a b ) mod p=( ( ( a2) mod p )b/2 * a) mod p;
-
注意:上面的 b/2 为整除运算
代码:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
long long a,b,p,re=1;
cin>>a>>b>>p;
while(b>0)
{
if(b%2==1)
re=(re*a)%p;
a=(a*a)%p;
b/=2;
}
cout<<re<<endl;
}
执行结果: