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

题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。

输入输出格式
输入格式:
三个整数b,p,k.

输出格式:
输出“b^p mod k=s”

s为运算结果

输入输出样例

2 10 9
//输出
//2^10 mod 9=7

解题思路

  • 利用模运算的性质, a ∗ b % k = ( ( a % k ) ∗ ( b % k ) ) % k a*b\% k=((a\%k) *(b\%k) )\% k ab%k=((a%k)(b%k))%k
  • p p p的奇偶性讨论,如2^7%k=2^3 *2%k,2^3%k=2^2*2%k,…
  • 注意 p & 2 p\&2 p&2相当于 p % 2 = = 1 p\%2==1 p%2==1; p > > = 1 p>>=1 p>>=1相当于 p / = 2 p/=2 p/=2
#include <iostream>
#include<vector>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll; 
//快速幂  
ll b,p,k,ans=1; 
int main(int argc, char** argv) {
	cin>>b>>p>>k;
	printf("%lld^%lld mod %lld=",b,p,k);
	if(p==0){
		printf("%lld\n",1%k);
		return 0;
	}
	while(p>=1){
		if(p&1){
			ans=(ans%k)*(b%k)%k ;
		}//奇数 {
//		b*=b%k;
		b=(b*b)%k;
		p>>=1;//p/2 
	}
    printf("%lld\n",ans);
    return 0;
}
posted @ 2018-09-18 21:56  xzhws  阅读(54)  评论(0编辑  收藏  举报