luogu1226:快速幂(模板题)

题目传送门

这是一个二分思维的板子,将高次的幂运算,用二分的方法降低时间复杂度,最终变成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 的数值一般都超级大,孩子用循环暴力枚举必然超时的那种!)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值