0
点赞
收藏
分享

微信扫一扫

信奥1326取余运算(快速幂的递归、循环写法,附视频)

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君学的(我是废物…)
视频讲的很详细,这里附上视频链接:
快速幂循环写法
快速幂递归写法

举报

相关推荐

0 条评论