原题链接:https://www.luogu.org/problem/P1226
题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
输入输出格式
输入格式:
三个整数b,p,k.
输出格式:
输出“b^p mod k=s”
s为运算结果
输入输出样例
输入样例#1:
2 10 9
输出样例#1:
2^10 mod 9=7
说明
时空限制:1000ms 125M
思路:快速幂的模板题,同时结合取模运算。
快速幂:
推荐一篇不错的博客:快速幂
取模运算规则:
- (a + b) % p = (a % p + b % p) % p
- (a - b) % p = (a % p - b % p) % p
- (a * b) % p = (a % p * b % p) % p
- a ^ b % p = ((a % p)^b) % p
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int main()
{
ll b,p,k;
cin>>b>>p>>k;
//ans表示最终运算结果,将b暂存入base,p暂存入t
ll ans=1,base=b,t=p;
while(t>0){ //如果t在二进制下还未用完
if(t&1){ //如果t在二进制下最后一位是1
ans=ans*base%k; //乘上base再对k取模
}
base=base*base%k; //自乘再取模
t>>=1; //二进制数右移一位
}
ans%=k; //最后来一次总的取余
cout<<b<<"^"<<p<<" "<<"mod"<<" "<<k<<"="<<ans<<endl;
return 0;
}