快速幂

Description

求a的b次方对p取模的值,其中 0 ≤ a,b,p ≤ 109
扩展题目:POJ1995 Raising Modulo Numbers
Input

a,b,p
Output

输出a的b次方对p取模的值
Sample Input

123478623 0 1000000000
Sample Output

1

本题如用一般的思想是循环b次每层循环进行乘积运算并进行求模运算,所以这里的运算主要卡在了循环上。
这里用快速速幂的原理就是减少循环的次数从而达到开速求解幂的目的。
这里分析b,因为每一个整数都能分解成2^k,当k取不同的值时的求和。
例如:10=2 ^3 + 2 ^1
11=2 ^3 +2 ^1+ 2 ^0
……
所以这里关键的快速幂的代码是

for(;b;b>>=1)//该语句相当于将b分解为了二进制
   //这里的a就依次是a^1   a^2   a^4 ……
   //并且依据b的二进制的分解判断是否分解为当前幂
{
	if(b&1)ans=(ll)ans*a%p;
	a=(ll)a*a%p;
	
}	   
#include<iostream>
using namespace std;
typedef long long int ll ;
ll power(ll a,ll b,ll p)
{
ll ans=1%p;
for(;b;b>>=1){
	if(b&1)ans=(ll)ans*a%p;
	a=(ll)a*a%p;
	
}	
return ans;
}
int main(){
	ll a,b,p;
	cin>>a>>b>>p;
	cout<<power(a,b,p);
	 

	return 0;
	
}

Description
求a的b次方对p取模的值,其中 0 ≤ a,b,p ≤ 10^18

Input
a b p

Output
输出a的b次方对p取模的值

Sample Input
92233720368547758 2 100
Sample Output
64
More Samples

//
//综合利用快速乘和快速幂

#include<iostream>
using namespace std;
typedef long long int ll;
ll mul(ll a,ll b, ll p)
{
	ll ans=0;
	for(;b;b>>=1)
	{
		if(b&1)ans=(ans+a)%p;
		a=a*2%p;
		
		
	}
return ans;
}
ll power(ll a, ll b,ll p)
{
	ll ans=1;
for(;b;b>>=1)
{
if(b&1)ans=ans*a%p;
//若还是用原来的a=a*a%p;会由于数据太大而爆掉
//所以这里用到了快速乘的方法 
	a=mul(a,a,p)%p;
}
return ans;

}
int main(){
	freopen("qwe.txt","r",stdin);
	
	ll a,b,p;
	cin>>a;
	cin>>b;
	cin>>p;
	cout<<power(a,b,p);
	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值