首页 > 其他分享 >快速幂

快速幂

时间:2024-02-15 14:55:04浏览次数:23  
标签:22 ll times ans quick 快速 mod

法一:运用位运算简化计算

以 \(3^{22}\) 为例,它的底数为 \(3\),指数为 \(22\)。指数的二进制形式为 10110。通过二进制与十进制的转换,我们可以把 \(22\) 分解为 \(22 = 2^4 * 2^2 * 2^1\)。因此,\(3^{22} = 3^{2^4} * 3^{2^2} * 3^{2^1}\)。我们有以下几点发现:

  • 1、\(2^4\), \(2^2\) 和 \(2^1\) 与二进制形式中 \(1\) 的出现位置有关,那么,这也导致 \(3^{2^4}\), \(3^{2^2}\) 和 \(3^{2^1}\) 有这样的关系。
  • 2、我们知道,在二进制中,相邻的两位,从“右边到左边”要 × 2。比如,\(2^2 = 2^1 \times 2\); 由于中间隔了一个 \(0\),所以要乘两个 2,\(2^3 = 2^2 \times 2~\Rightarrow~2^4 = 2^3 \times 2\)。反应到 \(3^{22}\) 上,就变成了 平方 关系。比如,\(3^{2^2} = 3^{2^1} \times 3^{2^1}\); 由于中间隔了一个 \(0\),所以要 平方 两次,\(3^{2^3} = 3^{2^2} \times 3^{2^2}~\Rightarrow~3^{2^4} = 3^{2^3} \times 3^{2^3}\)。
ll quick_pow(ll x, ll n, ll mod)
{
	ll ans = 1;
	while (n > 0)
	{
		if (n & 1)
			ans = ans * x % mod;
		x = x * x % mod;
		n >>= 1;
	}
	return ans;
}

法二:运用递归的思想

对于 \(x^n\),有

\[\begin{split} x^n = \begin{cases} {(x^2)}^{\lfloor n / 2\rfloor}&,n为偶数 \\ {(x^2)}^{\lfloor n / 2\rfloor} \ast x&,~n为奇数 \end{cases} \end{split} \]

令 \(x^n =\) quick_pow(x, n),则递归方程:

\[\begin{split} \text{quick\_pow(x, n)} = \begin{cases} 1&,n==0 \\ \text{quick\_pow(x, n / 2)}&,n为非0偶数 \\ \text{quick\_pow(x, n / 2)} \ast \text{x}&,n为奇数 \end{cases} \end{split} \]

ll quick_pow(ll x, ll n, ll mod)
{
	if (n == 0)    return 1;
	ll ans = quick_pow1(x * x % mod, n / 2, mod);
	if (n & 1)    ans = ans * x % mod;
	return ans;
}

标签:22,ll,times,ans,quick,快速,mod
From: https://www.cnblogs.com/hoyd/p/18016249

相关文章

  • 如何快速了解一个行业
    那么作为门外汉,如何快速了解一个行业。可以从四个层面系统性地去了解1、行业了解的目的一般来说,从企业角度出发做行业分析的目的通常有三个:了解所属行业的发展现状、竞争优劣、行业前景等,现在这个行业里竞争环境如何。挖掘行业机会点,明确优势,看清劣势,寻找与领先企业的差距,改......
  • 快速部署最简单的 Git 服务 Gogs
    前面介绍了Gitlab的搭建,功能很强大,无论是cpu还是内存,要求机器的配置要高一些。如果没有比较高的机器配置,只使用最常用的Git代码托管功能,那么就使用Gogs来快速部署吧。Gogs是一款极易搭建的自助Git服务。旨在打造一个以最简便的方式搭建简单、稳定和可扩展的自助Git......
  • Jsoup的快速使用--简单实用
    Jsoup的使用通常分为四步:1.导入jar包2.加载XML文档进内存,获取DOM树对象Document2.1获取类加载器ClassLoaderclassLoader=Demo1.class.getClassLoader();2.2使用类加载器找到XML文档的路径Stringpath=classLoader.getResourc......
  • 快速幂学习笔记
    我们不妨先来看一道例题了解一下快速幂:【模板】快速幂Atemplate.观察到数据,\(a,b\le2^{31}\),普通的乘法是肯定不行的。因此考虑优化:快速幂。什么是快速幂?顾名思义,就是快速地求出幂(\(a^b\))。怎么快速地求出幂?将\(a^b\)展开,可得:\[a^b=\underbrace{a\timesa\timesa......
  • 【笔记】矩阵快速幂
    前置芝士快速幂。什么是矩阵?矩阵,是由\(\begin{bmatrix}\end{bmatrix}\)组成的一个方阵(就这么理解好啦)。比如:\(\begin{bmatrix}1&2\\3&4\end{bmatrix}\)是一个\(2\times2\)的矩阵。矩阵乘法矩阵乘法的条件:仅当第\(1\)个矩阵的列数\(=\)第\(2\)个矩阵的行数才有......
  • 一个好用的IDEA插件RestfulTool: 根据url快速定位方法
    前言我们平时使用IDEA进行web开发,URL通常会分开写在Controller的类和方法上,用一个完整的URL很难定位到具体的方法。IDEA的插件RestfulTool,提供了这样的能力,根据完整URL直接定位方法。使用下载插件有很多插件都有此功能,这里我们选择RestfulTool插件。简单使用......
  • 补基础题(快速幂)
    P1226【模板】快速幂-洛谷|计算机科学教育新生态(luogu.com.cn)#include<iostream>#include<cstring>usingnamespacestd;typedeflonglongll;lla,b,p;llquickpow(lla,llb){llans=1,base=a;while(b>0){if(b&1)ans=ans*base%p;......
  • 快速初始化容器化Gin项目
    Gin是一个使用Go语言开发的Web框架,追求性能和效率。1、使用Gin快速初始化项目创建项目目录:在命令行中创建一个新目录,用于存放项目文件。然后进入该目录:mkdirmy-gin-democdmy-gin-demo初始化Go模块:在项目目录中运行以下命令以初始化Go模块。这会创建一个go.mo......
  • 5小步快速集成使用sentinel限流
    在微服务系统中,缓存、限流、熔断是保证系统高可用的三板斧。本文通过如下几个小步骤,即可让spring项目快速集成使用sentinel实现系统限流。1、环境和资源准备sentinel支持许多流控方式,比如:单机限流、熔断降级、集群限流、系统保护规则、黑白名单授权等。本文介绍如何快速集成......
  • 3步让Dubbo项目快速集成Sentinel
    在微服务系统中,缓存、限流、熔断是保证系统高可用的三板斧。本文通过3个步骤,让Dubbo项目快速集成使用Sentinel实现系统限流。本文接着《5小步快速集成使用sentinel限流》,继续介绍Dubbo项目如何快速集成使用Sentinel。1、环境和资源准备环境和资源准备,参看《5小步快速集成使用......