P1226 【模板】快速幂 题解

题目传送锚点

在博客园食用更佳

注:应要求,本篇题解分为简介、思路、代码三个部分。

简介

所谓“快速幂”,顾名思义,就是快速地算出 ab 的值。

正常人在刚学习了循环结构时,如果需要求 ab,就会循环 b 次计算。但当 0b<231 时,事情就不一样了。很明显,它会超时。

快速幂则是一个 O(logn) 的求幂算法。

那么如何让 O(n) 秒变 O(logn) 呢?请看VCR。

思路

在初一学到幂的时候,我们会知道一个运算法则:

ax+ay=ax+y

那么我们就可以考虑把 ab 拆了。以 313 举例,它就可以拆成 38×34×31 的形式。

这时我们就能看出,这不就是在求 b 二进制形式吗?!嗯,那就简单了。只需要同过取余法转化进制就行了。

代码

有点懵就看代码注释吧。

#include<bits/stdc++.h>
#define int long long	//十年OI一场空,不开long long见祖宗 
using namespace std;

int n,m,a,b,ans=1,mod;
signed main()
{
	cin>>n>>m>>mod;
	a=n;
	b=m;							//输出要用,先存一下 
	while(m)						//当m还能再转化成二进制 
	{
		if(m%2) ans=(ans*n)%mod;	//如果这一位为1,那么就乘上这一位的对应值——a^(2^m) 
		n=(n*n)%mod;				//计算下一位的位值 
		m/=2;						//正常转化二进制 
	}
	cout<<a<<"^"<<b<<" mod "<<mod<<"="<<ans%mod;	//输出不要忘了取余 
	return 0;
}
posted @   cath20  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示