1326:【例7.5】 取余运算(mod)
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
输入b,p,k的值,求bpmodk的值。其中b,p,k×k为长整型数。
【输入】
输入b,p,k的值。
【输出】
求bpmodk的值。
【输入样例】
2 10 9
【输出样例】
2^10 mod 9=7
这是一道快速幂的板子题。这里给出快速幂的循环写法和递归写法:
循环写法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, n, p;
ll qpow(ll a, ll n) {
ll prod = 1; //连乘器
while (n > 0) {
if (n & 1) prod = prod * a % p; //如果二进制位为1,则乘到连乘器上
a = a * a % p; //底数平方
n >>= 1; //指数右移
}
return prod;
}
int main()
{
cin >> a >> n >> p;
printf("%lld^%lld mod %lld=%lld\n", a, n, p, qpow(a, n));
return 0;
}
递归写法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, n, p;
ll qpow(ll a, ll n) {
if (n == 0) return 1;
a %= p;
ll c = qpow(a, n >> 1);
if (n & 1) return c * c % p * a % p;
return c * c % p;
}
int main()
{
cin >> a >> n >> p;
printf("%lld^%lld mod %lld=%lld\n", a, n, p, qpow(a, n));
return 0;
}
然后快速幂我是跟着小学生Vita君学的(我是废物…)
视频讲的很详细,这里附上视频链接:
快速幂循环写法
快速幂递归写法