问题类型:求 a^b mod c 值的问题
问题难点:在C语言中 a^b如果b较大,a较多那么我们的时间复杂度是比较大的
优化原理:二进制优化法,什么是二进制优化法呢?其实法如其名,我们将一个较大的数字通过二进制表示(比如,我们提前记录 0 1 2 4 8 ... 这些2^x的数字,再通过二进制组合出b就可以快速得到a^b的值,如32如果每次直接幂运算32次就比较耗时,通过处理为0010 0000,我们就只需要找出从右至左第六位即可)
问题实例:
给定 n 组 a(i),b(i),p(i),对于每组数据,求出 a(i)^b(i) mod p(i) 的值。
输入格式
第一行包含整数 n。
接下来 nn 行,每行包含三个整数 a(i),b(i),p(i)。
输出格式
对于每组数据,输出一个结果,表示 a(i)^b(i) mod p(i) 的值。
每个结果占一行。
数据范围
1≤n≤100000,
1≤a(i),b(i),p(i)≤2×10^9
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
答案展示
#include<stdio.h>
long long quick_mi(int a, int b, int p)
{
long long res = 1 % p;
while (b) //二进制处理b
{
if (b & 1) res = res * a % p; //与运算 即第一位是1即表示可处理
a = a * (long long)a % p;
b >>= 1; //将二进制右移,使我们可以处理第一位
}
return res;
}
int main()
{
int n;
scanf("%d", &n);
while (n -- )
{
int a, b, p;
scanf("%d%d%d", &a, &b, &p);
printf("%lld\n", quick_mi(a, b, p));
}
return 0;
}