当然,我做的题目的范围是这样的:
x为a,p为b,m为p
题目传送门:【模板】快速幂 | 取余运算 - 洛谷
OK介绍完题目,开始进行题目解析。(为方便讲解,以下以我给的数据的变量名为准)
实际上p的大小并不重要,重要的是你要知道快速幂是啥。同时还得把他的递推式搞清楚!
这就是快速幂了。可以帮你快速的求出你想要的数的幂是多少。
(虽然我感觉在long long范围内没啥用 doge)
在递推式中,有这么几个坑(全是我踩过的):
1.以为只要考虑好p的奇偶性就没有任何问题了
f = 1;
while (p != 1)
{
x = x * x % m;
p = (p + 1) / 2;
}
你有没有想过x的值实际上一直在变!!!
2.解决完上面的问题,我觉得自己行了,然后提交。呵呵,我的分数只有15分(不是洛谷的评测)
f = 1, f = f;
while (p != 1)
{
if(p % 2 == 0) f = f * x % m;
x = x * x % m;
p /= 2;
}
实际上当p为奇数时,那个分出来的x也一直在变啊.
3.当你解决完上面的所有问题后发现,以上两个问题得和起来才是最终答案
所以以下才是最终答案:
#include <bits/stdc++.h>
#define ll long long
ll x, m, p, f = 1;
using namespace std;
int main()
{
cin >> x >> p >> m;
while (p != 1)
{
if (p % 2 == 1) f = f * x % m;
x = x * x % m;
p /= 2;
}
x = x * f % m;
cout << x << endl;
return 0;
}
如果对你有帮助,点个赞吧,求求啦。φ(>ω<*)