当前位置: 首页 > news >正文

蓝桥杯备考:倍增算法详解

如果我们想暴力求解的话,我们的时间复杂度是O(N)b最大是10的9次方,这时候我们一定会超时

#include <iostream>
using namespace std;

typedef long long LL;
LL a,b,p;LL ret = 1;
int main()
{
	cin >> a >> b >> p;
	for(int i = 1;i<=b;i++)
	{
	   ret = (ret*a)%p;	
	}
	printf("%lld^%lld mod %lld=%lld",a,b,p,ret);
	
	
	
	
	return 0;
}

这时候我们就要用快速幂的思想来优化我们的算法了

那如果我们求的幂不在这些倍增的序列里面,该怎么办才好呢?

这时候我们就要结合一下二进制了

比如a的11次方 也就是a的(1011)2  次方    实际上就等于a(1*2的三次方+0*2的二次方+1*2的一次方+1*2的零次方) 也就是

好的,时间复杂度解决了,为了防止溢出,我们的取模是随时的

我们讲解一下取模的性质吧

性质1:如果只有加法和乘法:取模可以再任何时候取模(a*b*c*d)%p 等价于 a%p*b%p*c%p*d%p

性质2:如果是减法 为了避免负数,我们可以模加模 也就是((a-b)%p+p)%p

性质3;如果有除法:当计算过程中存在除法的时候,我们取模是会出现错误的,这时候我们需要求个逆元,我们数论章节会讲解的

#include <iostream>
using namespace std;
typedef long long LL;
LL a,b,p;

LL quickcal(LL a,LL b, LL p)
{
	LL ret = 1;
	while(b)
	{
		if(b&1) ret=ret*a%p;
		a=a*a%p;
		
		b>>=1;
	}
	return ret;
}
int main()
{
	cin >> a >> b >> p;
	
	printf("%lld^%lld mod %lld=%lld\n",a,b,p,quickcal(a,b,p));
	
	
	
	
	
	
	return 0;
}

相关文章:

  • 深度学习模型组件之优化器-自适应学习率优化方法(Adagrad、RMSprop)
  • Windows CMD 命令大全(综合开发整理版)
  • 【Python 数据结构 8.串】
  • Mysql的行级锁到底锁住了哪些行
  • Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(七)
  • 初阶数据结构(C语言实现)——4.1栈
  • blender学习25.3.8
  • 【Java学习笔记】三、运算符,表达式、分支语句和循环语句
  • 为什么js小数相加,会产生精度缺失的问题,怎么解决?
  • 模拟调制技术详解
  • 前后端数据加密传输【最佳方案】
  • 如何结合NLP(自然语言处理)技术提升OCR系统的语义理解和上下文感知能力?
  • Docker Engine 配置指南
  • 【高级篇】大疆Pocket 3加ENC编码器实现无线RTMP转HDMI进导播台
  • 《白帽子讲 Web 安全》之身份认证
  • 一篇文章讲解清楚ARM9芯片启动流程
  • 网络版汉译英服务(muduo)
  • HJ C++11 Day2
  • ControlNet
  • 多模式数据库如何向现代数据管理变革
  • 做交友网站怎么赚钱/关键词推广是什么意思
  • 公司网站开发排名/口碑营销案例2021
  • 云梦网络做网站/seo营销推广服务公司
  • 企业网站建设策划书范文/有哪些可以免费推广的平台
  • 住房建设部官方网站/百度搜索怎么优化
  • 中国建设银行征信中心网站/sem竞价专员