【题目描述】
输入b,p,k的值,求b^p mod k的值,其中b,p,k*k为长整型数。
【输入】
输入b,p,k的值。
【输出】
求b^p mod k的值。
【输入样例】
2 10 9
【输出样例】
2^10 mod 9=7
题目很简单。
我首先用死做,超时了
我然后用pow的(错误代码)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,k,bao;
int main(){
cin>>n>>m>>k;
bao=pow(n,m);
cout<<n<<"^"<<m<<" mod "<<k<<"="<<bao%k;
}
错了。
想了想,用分治吧!(错误答案)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,z;
int par(int y){
int c;
if(y==1) return x;
if(y%2==1) return par(y/2)*par(y/2)*x;
else return par(y/2)*par(y/2);
}
main(){
cin>>x>>y>>z;
cout<<x<<"^"<<y<<" mod "<<z<<"="<<par(y)%z;
}
错了。
想着时间超限吧,加了ans加快速度。。。(原本只需做两次的只做一次就行了)(错误答案)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,z;
int par(int y){
int ans;
if(y==1) return x;
if(y%2==1){
ans=par(y/2);return ans*ans*x;
}
else{
ans=par(y/2);return ans*ans;
}
}
main(){
cin>>x>>y>>z;
cout<<x<<"^"<<y<<" mod "<<z<<"="<<par(y)%z;
}
内存超限…………………………………………
最后想到,同余。
a*b*c%k=a%k*b%k*c%k;不会爆。
所以(正确答案)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,z;
int fz(int y){
int c;
if(y==1) return x%z;
if(y%2==1) return c=fz(y/2),c*c%z*x%z;
else return c=fz(y/2),c*c%z;
}
main(){
cin>>x>>y>>z;
cout<<x<<"^"<<y<<" mod "<<z<<"="<<fz(y);
}
我阿米诺斯。