快速幂:就是能够快速地计算出以 a 为底数,b 为指数的幂,相较于传统的求幂算法,当指数 b 非常大时,使用快速幂算法,可以大大地降低循环的次数。
以3 ^ 13 为例:
-
首先将 b 转换成二进制:;
-
所以=;
-
那么 a ^ b 可以转换为: ;
#include<iostream>
using namespace std;
int main()
{
long long a, b;
long long ans=1,tmp;
cin>>a>>b;
tmp=a;
while(b)
{
if(b&1) ans=ans*tmp; //该位是1,则表示存在
tmp=tmp*tmp;
b>>=1; //向左移一位
}
cout<<ans;
}
一边情况下题目数据算出来较大,所以需要取模。p为模,代码如下:
#include<iostream>
using namespace std;
int main()
{
long long a, b,p;
long long ans = 1, tmp;
cin >> a >> b>>p;
tmp = a;
while (b)
{
if (b & 1) ans = ans * tmp%p;
tmp = tmp * tmp%p;
b >>= 1;
}
cout << ans;
}
例题:
题目描述
找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。
月月的其中一项作业是:给定正整数A、B、P,求ABmod PA^B\mod PABmodP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程序,所以这个任务就交给你了。
因为月月的作业很多,所以有T组询问。
输入描述:
第一行一个正整数T表示测试数据组数。 接下来T行,每行三个正整数A、B、P,含义如上文。
输出描述:
输出T行,每行一个非负整数表示答案。
示例1
输入
2 2 5 10 57284938291657 827493857294857 384729583748273
输出
2 18924650048745
思路
简单的快速幂,但是由于数据范围过大,在快速幂里的乘法不能直接相乘,得自己写一个类似于快速幂的快速乘。
#include<iostream>//快速幂 快速积
using namespace std;
long long ksj(long long a, long long b, long long p)//快速积
{
long long ans = 0;
while (b)
{
if (b & 1)
ans = (ans + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ans;
}
long long ksm(long long a, long long b, long long p)//快速幂
{
long long ans = 1;
while (b)
{
if (b & 1) ans = ksj(ans, a, p) % p;
a = ksj(a, a, p) % p;
b >>= 1;
}
return ans;
}
int main()
{
long long t, a, b, p, c;
cin >> t;
while (t--)
{
cin >> a >> b >> p;
c = ksm(a, b, p);
cout <<"结果:"<< c << endl;
}
}