AcWing寒假入门班:a^b(a的b次方)快速幂,取余运算——2021-02-05更

AcWing寒假入门组:a^b(a的b次方)

原题传送:AcWing 89. a^b(a的b次方)

题目:

求 a 的 b 次方对 p 取模的值。

输入
三个整数 a,b,p ,在同一行用空格隔开。

输出
一个整数,表示a^b%p的值。

数据范围

0≤a,b≤10^9

1≤p≤10^9

输入样例
3 2 7

输出样例
2

思路:

这道题目如果按照常规思路去做的话,一定会爆 (别说不可能,有本事你给我弄一个能存1亿的1亿次方的变量出来) 。所以要用到今天要讲的一个很重要的东西:同余定理。
同余定理:(a×b)%p=[(a%p)×(b%p)]%p。举个例子:10与4%3都得1,4与7%3都得1,则10与7%3得1,说明同余定理有传递性。同理,在这道题目中的a在求幂之前先做一次同余定理,求幂后再做一次%,那就可以得出答案而不会爆了。
PS:这道题目用位运算可以使程序运行时间减短,不然循环一亿次时间会爆。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull a,b,p;

ull ksm(ull a,ull b,ull p)
{
	ull h=1;
	while(b)
	{
		if(b&1)
			h=h*a%p;
		b>>=1;
		a=a*a%p;
	}
	return h%p;
}
int main()
{
	cin>>a>>b>>p;
	cout<<ksm(a,b,p);
	return 0;
} 

第一天做AcWing寒假入门班的题目,发现里面还有好多我不懂的东西,比如DP,DFS(深搜),背包问题之类的,还是要努力学习,才能赶上其他人。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值