题目
给定 n 组 ai,bi,pi,对于每组数据,求出 abiimodpi 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含三个整数 ai,bi,pi。
输出格式
对于每组数据,输出一个结果,表示 abiimodpi 的值。
每个结果占一行。
数据范围
1≤n≤100000,
1≤ai,bi,pi≤2×109
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
代码
#include <iostream>
using namespace std;
typedef long long LL;//数据中a为1e9, a*a可能爆int
/**
* eg:
* 求4^5 % 3
* 初始:a=4 b=5 p=3
* 第一步,把b分解成二进制 b=5=(101)二进制
* 4^(2^0) == 4 == a
* 4^(2^1) == 16 == (4^(2^0)) ^2 == a^2
* 4^(2^2) == 256 == (4^(2^1)) ^2 == (a^2)^2
* ...
*
* 则4^5 == 4^(2^0) * 4^(2^2) == 4^(2^0 + 2^2) == 4^5
*
**/
int qmi(int a, int b, int p){
int res = 1;
while(b){
if(b & 1) res = (LL)res * a % p;// LL最后都会转为int,LL只是确保计算结果正确
a = (LL) a * a % p;//每次a变成a^2
b >>= 1;//b去掉末位
}
return res;
}
int main()
{
int n;
cin >> n;
while(n --){
int a, b, p;
scanf("%d%d%d", &a,&b,&p);
printf("%d\n", qmi(a,b,p));
}
return 0;
}