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(深搜),背包问题之类的,还是要努力学习,才能赶上其他人。

猜你喜欢

转载自blog.csdn.net/SSL_wyd/article/details/113705166