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