luogu1226:快速幂(模板题)

题目传送门

这是一个二分思维的板子,将高次的幂运算,用二分的方法降低时间复杂度,最终变成O(logN);

题目大意:

 求 a 的 x 次方,答案 mod p。

(其中 x 的数值一般都超级大,孩子用循环暴力枚举必然超时的那种!)



思路分析:

 1、举个栗子:

 (3)^17 => ((3)^16)*3;

 (3)^16 => (3*3)^8 => ((3)^2)^8 ;

如果以上两行的内容你能看懂 恭喜你~~已经明白了快速幂的核心思路。

上代码(没错,我要讲的已经结束,不懂的请看代码):

#include
#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 的数值一般都超级大,孩子用循环暴力枚举必然超时的那种!)



你可能感兴趣的:(题解,模板题)