我会快速幂了!!!!!!!!!

题目描述

给你三个整数 b,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

说明/提示

【样例解释】
2^{10} = 10241024 mod 9 = 7

【数据范围】
对于 100%的数据,0b,p,k<2^31

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int ksm(int,int,int);
int main()
{
int b,p,k;
cin>>b>>p>>k;
cout<<b<<"^"<<p<<" mod "<<k<<"="<<ksm(b,p,k);
return 0;
}
int ksm(int x,int y,int p)
{
if(y==0) return 1%p;//任何数的0次方都是1,所以直接返回1%p
int z=ksm(x,y/2,p);//定义一个新变量,让它等于开方后的数。这是一种二分的思想,比如本题样例:2^10=2^5*2^5=(2^2*2^2*2)*(2^2*2^2*2)......这样一直分下去,复杂度就是logn,因为每一次操作相当于开根,这样就可以大大降低复杂度。如果不用快速幂,那么就要一个一个乘下去,复杂度就是n。此题的范围是10^9,如果真的取到10^9,那么就会炸裂(计算机速度一般在3*10^8~8*10^8之间,为了保险一般只要时间复杂度在10^8以内就能保证在1s内跑出来)

z=1ll*z*z%p;//乘以1ll就相当于强制类型转化,将z从int转化为long long
if(y%2==1) z=1ll*z*x%p;//如果不能整除2,那么就要再多乘上一个x,只要乘logn次
return z;
}

原文地址:https://www.cnblogs.com/57xmz/p/12444677.html