给定 n� 组 ai,bi,pi��,��,��,对于每组数据,求出 abiimodpi����mod�� 的值。
输入格式
第一行包含整数 n�。
接下来 n� 行,每行包含三个整数 ai,bi,pi��,��,��。
输出格式
对于每组数据,输出一个结果,表示 abiimodpi����mod�� 的值。
每个结果占一行。
数据范围
1≤n≤1000001≤�≤100000,
1≤ai,bi,pi≤2×1091≤��,��,��≤2×109
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
难度:简单 |
时/空限制:1.5s / 64MB |
总通过数:49440 |
总尝试数:78073 |
来源:模板题 |
算法标签 |
#include<bits/stdc++.h>
using namespace std;typedef long long LL;LL quickmi(LL base,LL mi,LL p)
{LL res=1;while(mi){if(mi&1) res=res*base%p;mi>>=1;base=base*base%p;}return res;
}int main()
{int n;scanf("%d",&n);while(n--){LL a,b,p;scanf("%lld%lld%lld",&a,&b,&p);LL ans=quickmi(a,b,p);printf("%lld\n",ans);}return 0;
}
快速幂的思路如下:首先需要注意一件事情,每一次中间运算都要取模,主要是为了防止发生溢出错误。快速幂的运算步骤是,先判断指数是否是奇数,假设指数是奇数,我们把答案乘以当前的底数,答案初始值为1,这一步操作结束之后,我们把指数除以2,把底数平方,比如说最开始是4^5,我们先把答案更新为4,然后把指数5除以2变成2(向下取整),把底数4平方变成16,操作结束之后指数不是奇数,不需要更新答案,指数再次变为原来的一半,2变成1,底数平方,变成16^2,操作结束之后,指数1是奇数,把答案更新,乘以当前的底数16^2,变成4*16^2,指数除以2变成0,结束循环。返回答案,也就是快速幂的结果。
主要利用的是指数可以拆成若干乘式的乘积,我们每一次把指数除以2,只需要把底数平方即可。注意考虑指数是奇数的情况,程序整除会向下取整。