您的位置:首页 > 其它

luogu1226:快速幂(模板题)

2018-02-03 22:00 134 查看
题目传送门

这是一个二分思维的板子,将高次的幂运算,用二分的方法降低时间复杂度,最终变成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 的数值一般都超级大,孩子用循环暴力枚举必然超时的那种!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速幂