这是一个二分思维的板子,将高次的幂运算,用二分的方法降低时间复杂度,最终变成O(logN);
题目大意:
求 a 的 x 次方,答案 mod p。
(其中 x 的数值一般都超级大,孩子用循环暴力枚举必然超时的那种!)
思路分析:
1、举个栗子:
(3)^17 => ((3)^16)*3;
(3)^16 => (3*3)^8 => ((3)^2)^8 ;
如果以上两行的内容你能看懂 恭喜你~~已经明白了快速幂的核心思路。
上代码(没错,我要讲的已经结束,不懂的请看代码):
#include<cstdio>
#define ll long long
ll s=1,t;
int a,x,k,p;
int main()
{
scanf("%d %d %d",&a,&x,&p);
k=x;t=a;//因为后面要输出 a、x的值,所以用 k、t替代
while(k>0)//快速幂的核心是对幂进行二分
{
if(k%2>0) //s存答案:当k为奇数时,帮忙存落单的t
{ s*=t; s%=p; } //当k为 1的时候,t内的缓存会全部给 s
t*=t; t%=p;
k/=2;
}
printf("%d^%d mod %d=%d",a,x,p,s);
return 0;
}
sdf
求 a 的 x 次方,答案 mod p。
(其中 x 的数值一般都超级大,孩子用循环暴力枚举必然超时的那种!)