您的位置:首页 > 其它

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

2019-08-18 17:06 120 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44668898/article/details/99706284

原题链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: