Super A^B mod C 快速幂+欧拉降幂 C++语言

本文介绍了如何使用C++结合快速幂和欧拉降幂算法解决超大数乘法模运算的问题。在面对ABmodC的计算时,当B的值极大,单纯快速幂无法满足时间复杂度要求,文章详细解释了欧拉降幂的作用,并给出了算法的代码实现,帮助理解如何高效地计算此类问题。
摘要由CSDN通过智能技术生成


一.题目来源

http://acm.fzu.edu.cn/problem.php?pid=1759

二.题目大意

求解 A B   m o d   C {A^B}\bmod C ABmodC的结果(1<=A,C<=1000000000,1<=B<=10^1000000)

三.解题思路

显然直接计算会超时。在遇到 A B A^B AB时,我们一般会想到用快速幂算法(log(n))来快速求解,但这题当中B的值可以是10^1000000,这个数字很大很大,远超long long的最大取值。单纯靠快速幂算法也无法满足题目的时间要求,因此再引入欧拉降幂算法来进一步加速计算。

四、算法介绍

1.快速幂

代码如下:

#define ll long long
ll fastpow(int a,int n){
    //计算a^n 
	ll ans=1;
	while(n){
   
		if(n&1) ans=ans*a; //n&1 判断此时以二进制表示的n的末位是否为1
		n>>=1; //以二进制表示的n整体往右移动一位,高位补0,低位舍去
		a=(ll)a*a;
	}
	return ans;
}

模拟示例

计算 3 9 3^9 39,对照代码中a=3,n=9(二进制表示为1001)

  1. 第一轮while循环:n&1=9&1=1,ans=ans×a=1×3=3 ,n=(100)D=4,a=a×a=9
  2. 第二轮while循环:n&1=4&1=0,ans不变,n=(10D)=2,a=a×a=81
  3. 第三轮while循环:n&1=2&1=0,ans不变,n=(1D)=1,a=a×a=6561
  4. 项目3.第四轮while循环:n&1=1&1=1,ans=ans×a=3×6561=19683,n=(0D)=0,a=a×a=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值