这是蒟蒻的第5篇题解。欢迎点赞,欢迎大佬来喷。
这是一道very经典的题目,我们可以用个递归和分治解决。
这时,一些初学者就会说:“这题一个pow,然后一%不香吗?”如果你想到这点,那就错了。
基于数据范围,所以本题不可能用暴力解决。那么我们可以用分治的思想分析一下指数的运算,推导出下列递归公式
x^y的三种情况:
1.1 如果y=0
2.xx^(y-1) 如果y为奇数
3.(x^2)^(y div 2) 如果y为偶数
同时,对于模运算有一个重要结论:AB%K=(A%K)*(B%K)%K
就这样,我们就可以用快速幂的递归思想,去快速计算b^p%k的值。去避免高精度。
下面是我们的代码:
#include<bits/stdc++.h>
using namespace std;
long b,p,k,n;//本题要开long
long mod(long a,long n,long k){
if(n==0) return 1%k;
if(n==1) return a%k;//先特判一下
long y=mod(a,n/2,k);
if(n%2==0) return y*y%k;//上面剩下的两种情况:奇偶
else return (((y*y)%k)*a)%k;
}
int main(){
cin>>n;
while(n--){//while循环读入,n不等于0就不结束
cin>>b>>p>>k;
b=b%k;//先缩小个b的数据
cout<<mod(b,p,k)<<endl;//直接调用函数
}
return 0;
}
完美撒花!(^▽^)
OK!本篇题解就到这了!首尾呼应:
欢迎点赞,欢迎大佬来喷。
闫老师永远的神
我没写题解
通俗易懂
为什么都会写题解啊$ORZ$……就我只写了两篇的吗……$wtcl$
个人总结了两个原因
还有一个原因:
您比较强而且比较假:-)