【快速幂】

2025博客之星年度评选已开启 10w+人浏览 1.4k人参与

【快速幂】

推荐视频链接
推荐好文
注:只是新手的笔记,慎看!!!欢迎大佬指错

求 an 怎样写呢?
可以先定义一个cns=1再用一个for循环每次让cns*=a对吧
但是这样时间复杂度就是**O(n)**了,毕竟只是一个小运算,时间复杂度还是有点高了对吧
于是,便引出了快速幂

啥是快速幂?
我们知道,一个数可以转为二进制,如13=1101
怎么来的?
13=1x23+1x22+0x21+1x20=8+4+0+1
于是,213便可以写成21101进一步写成 28+4+0+1 即28x24x21

那问题就来了,怎样把一个数弄成二进制?
我们可以对一个数 如13进行位运算&1
位运算&1可以把一个二进制最低位的数表示出来,1&1=1,0&1=0

于是,只要这一位为1,我就得乘这一位的对应2的次方
然后再通过右移运算符>>来逐位查看
代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;

int a,n,p;//p为取余

int mi(int a,int n)
{
	int cns=1;
	while(n)
	{
		if(n & 1) cns=(cns*a)%p;
		a=(a*a)%p;
		n>>=1;
	}
	return cns;
}
signed main()
{
	cin>>a>>n>>p;

	return 0;
 } 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值