快速幂

问题描述
给定A, B, P,求(A^B) mod P。
输入格式
输入共一行。 第一行有三个数,A, B, P。
输出格式
输出共一行,表示所求。
样例输入
2 5 3
样例输出
2
数据规模和约定
A, B为64位范围内的非负整数,P为32位范围内的非 负整数

//递归快速幂
解决方法
不能直接采用pow函数,由于A=1000,B=1000, (A^B) 都将是一个天文数据(基本数据类型无法装下,计算复 杂)。

思路:
10^1%7
=10%7
=3
10^2%7
=100%7
=2
换个解法,根据公式进行降幂:
10^2%7 =(1010)%7------根据公式(ab)%c=((a%c)(b%c))%c =((10%7)(10%7))%7 =(33)%7 =2
那么
10^4%7
=((10^2%7) (10^2%7))%7
=(2
2)%7
=4
那么
10^5%7
=((10
(10^4))%7
=((10%7)(10^4%7))%7
=(3
4)%7
=5

long powAndMod(long a, long b, int p) 
{  
	long result = 1;  
	long mod = a % p;  
	if(b==0)  return 1;  
	if(b % 2 == 1){    
		b--;     
		long c=powAndMod(a, b, p);   
		result=(result*mod*c)%p;  
	}  
	else{   
		b/=2;      
		long c=powAndMod(a, b, p);   
		result=(result*c*c)%p;  
	}  
	return result; 
	}

//通过位运算来解题
原理和上述类似。
通过b&1判断是否b的最后一位是否为1,是1就执行ans*a的操作,不论是不是都要执行a*a的操作以及b>>1,因为这代表着b的每个位上a的值
即:a,a^2, a^4…

#include<iostream>
using namespace std;
#define ll long long
ll powAndMod(ll a,ll b,ll m)//a^b%m
{
	a=a%m;
	ll ans=1;
	while(b)
	{
		if(b&1)
		{
			ans=ans*a%m;
			//可用快速乘优化,快速乘=》看上一篇博客
			/*ans=mil(ans,a,m);*/
		}
			a=a*a%m;
			/*a=mil(a,a,m);*/
			b>>=1;
	}
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值