描述
对于给定的三个正整数 a,b,p ,计算 a的b次方modp 。
输入描述:
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≦T≦5×10^5) 代表数据组数,每组测试数据描述如下:
一行上输入三个整数 a,b,p(0≦a,b≦10^9; 0<a+b; 1≦p≦10^9) 代表底数、指数和模数。输出描述:
对于每一组测试数据,在一行上输出一个整数,代表式子的答案。
示例1
输入:
4 1 0 1 0 1 10 2 3 10 3 3 12输出:
0 0 8 3
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.给出T组数据
2.每组数据包含a,b,p三个正整数
3.求a的b次方mod p(对p求模)的值
二、解题思路
1.快速幂算法:原理:基于二进制位运算和乘法结合律,
将指数b转换为二进制形式,根据二进制位上的值来决定是否将当前的结果ans乘以底数a的相应次幂(通过不断对a进行平方操作来快速得到不同次幂的值),同时每一步都对p取模,这样可以避免中间结果过大导致整数溢出,并且高效的计算出最终结果。
2.具体步骤:首先初始化ans为1,用来存储最终结果
进入while循环,循环条件是b不为0,只要b还有值,说明还需要继续进行计算
在循环内部:通过if(b&1)判断b的二进制表示的最低位是否为1,如果为1
ans = ans * a % p;
然后执行a = a * a % p;这一步是将底数a进行平方操作,对p取模就得到了a的最高次幂,为下一次循环做准备
最后执行b>>=1,将b的二进制位表示右移一位,相当于去掉已经处理过的最低位,继续处理下一位
如此反复,直到b值为0,此时ans中存储的就是a的b次方对p取模的最终结果。
三、具体步骤
使用的语言是C
#include <stdio.h>// 快速幂算法,计算a的b次方对p取模的结果
int quick_pow(int a, int b, int p) {int ans = 1;while (b) {if (b & 1) {ans = (long long)ans * a % p;}a = (long long)a * a % p;b >>= 1;}return ans;
}int main() {int T;scanf("%d", &T);while (T--) {int a, b, p;scanf("%d%d%d", &a, &b, &p);if(b == 0 && p == 1) {printf("0\n");} else {int result = quick_pow(a, b, p);printf("%d\n", result);}}return 0;
}