P1226 【模板】快速幂||取余运算(C++_数论)

题目描述

给你三个整数 b,p,kb,p,k,求 b^p mod k。

输入格式

一行三个整数 b,p,k

输出格式

输出 b^p mod k=s

s 为运算结果

输入输出样例

输入 #1

2 10 9

输出 #1

2^10 mod 9=7

说明/提示

【样例解释】
210 = 1024,1024 mod 9 = 7。

【数据范围】
对于 100% 的数据,0≤b,p,k<231

反思

第一次接触这个看了不少大佬的代码~
单纯的快速幂可以这样:

while (p > 0)
	{
		if (p & 1)//二进制位该位是否为1
			ans *= b;//有就乘上
		b *= b;//自乘,时刻准备着
		p >>= 1;//二进制向右移位
	}

取余主要是用了这个公式:

(A×B) mod b=((A mod b)×(B mod b)) mod b

其实还有一个取余公式:

(A+B) mod b=(A mod b+B mod b) mod b

源码

#include
using namespace std;
int main()
{
	long long ans = 1, b, p, k;
	cin >> b >> p >> k;
	cout << b << "^" << p << " mod " << k << "=";
	if (p == 0)
	{
		cout << 1 % k;
		return 0;
	}
	while (p > 0)
	{
		if (p & 1)//二进制位该位是否为1
		{
			ans *= b;//有就乘上
			ans=ans % k;
		}
		b *= b;//自乘,时刻准备着
		b %= k;
		p >>= 1;//二进制向右移位
	}
	cout << ans;
	return 0;
}

你可能感兴趣的:(算法)