【洛谷】P1226 【模板】快速幂||取模运算

原题链接: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


思路:快速幂的模板题,同时结合取模运算。

快速幂:

推荐一篇不错的博客:快速幂

取模运算规则:

  1. (a + b) % p = (a % p + b % p) % p
  2. (a - b) % p = (a % p - b % p) % p
  3. (a * b) % p = (a % p * b % p) % p
  4. 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;
}

你可能感兴趣的:(【洛谷】P1226 【模板】快速幂||取模运算)