给定 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
- 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,只需要把底数平方即可。注意考虑指数是奇数的情况,程序整除会向下取整。