算法模板:数论之快速幂

简介: 算法模板:数论之快速幂

前言


唤我沈七就好啦。


快速幂


给 你 三 个 整 数 a , k , p , 求 a k  m o d   p


数据范围

1≤n≤105

1≤ai,pi≤2∗109


思路


将 指数转化成 二进制


只需要在指数的二进制为 1 时 与 底数的幂次方 相成即可


底数的幂次方是在不断 自乘的中生成的


实现方法


每次判断 指数 二进制 末尾是否是 1。


如果是 就更新答案 ans = ans * a % p 之后 k >> 1。


底数自乘 a = a * a % p 。


例如: k=11,二进制下是 k=1011 。

b ( 二 进 制 ) 的 最 后 一 位 是 1 吗 ? 是 的 。 这 代 表 a 11 = a 8 × a 2 × a 1 中 的 a 1 存 在 。


这时 答案 ans = ans * a % p , a = a^1 之后 a 累乘 a = a * a % p ;


之后 在通过 k>>=1 的操作 将 k 二进制的第二位数移到最后一位,再次 判断是否 1。


ans = ans * a % p ,此时的 a = a ^ 2 % p,a 继续累乘 a = a * a % p ;


直到判断到第 3 位时发现并不为 1 ,这是 ans 不更新 ,a 继续累乘 .


重复上述操作 ans = ans * a % p ,此时 a = a ^ 8 % p;

a 11 = a 8 × a 2 × a 1

算法模板


typedef long long LL;
LL power(LL a,LL k,LL p)
{
  LL ans=1;
  while(k)
  {
  if(k&1)ans=ans*a%p;
  k>>=1;
  a=a*a%p;
  }
  return ans;
}


快速幂求逆元


给定 n 组 a i,p i,其中 p i 是质数,求 a i 模 p i


的乘法逆元,若逆元不存在则输出 impossible。


注意:请返回在 0∼p−1


之间的逆元。


乘法逆元的定义


若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/b≡a×x(modm),则称 x 为 b 的模 m 乘法逆元,记为 b−1(modm)。

b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b m−2 即为 b 的乘法逆元


人话:


x 满足 b * x = 1 %(n) 则称 x 为 b 的逆元


即 b乘其逆元的积%上一个给定的数 等于 1


当n为质数时,结合费马定理,可以用快速幂求逆元:


a / b ≡ a * x (mod n)

两边同乘b可得 a ≡ a * b * x (mod n)

即 1 ≡ b * x (mod n)

同 b * x ≡ 1 (mod n)


由费马小定理可知,当n为质数时


b ^ (n - 1) ≡ 1 (mod n)

拆一个b出来可得 b * b ^ (n - 2) ≡ 1 (mod n)

故当n为质数时,b的乘法逆元 x = b ^ (n - 2)


#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
int a,b;
int hh,tt=-1; 
LL power(LL a,LL k,int p)
{
  LL ans=1;
  while(k)
  {
  if(k&1)ans=ans*a%p;
  k>>=1;
  a=a*a%p;
  }
  return ans;
}
int main()
{
  int n,m,p;
  cin>>n;
  while(n--)
  {
  cin>>a>>p;
  if(a%p==0)
  printf("impossible\n");
  else
  cout<<power(a,p-2,p)<<"\n";
  }
  return 0;
}


完结散花


ok以上就是对 算法模板:数论之快速幂 的全部讲解啦,很感谢你能看到这儿。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。


参考文献


https://www.acwing.com/activity/content/19/


相关文章
|
6月前
|
算法
Hierholzer算法dfs找欧拉回路模板
Hierholzer算法dfs找欧拉回路模板
70 0
|
存储 算法 决策智能
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
83 0
|
算法 C++ 容器
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
51 0
|
算法 C++ 索引
函数模板和类模板 知识点总结 C++程序设计与算法笔记总结(七) 北京大学 郭炜(下)
函数模板和类模板 知识点总结 C++程序设计与算法笔记总结(七) 北京大学 郭炜(下)
47 0
|
3月前
|
算法
【算法】前缀和——二维前缀和模板题
【算法】前缀和——二维前缀和模板题
|
5月前
|
算法 Java 数据处理
Java算法模板 数据流快读
Java算法模板 数据流快读
36 2
|
4月前
|
设计模式 JavaScript 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
164 0
|
5月前
|
算法 前端开发 安全
C++算法模板
C++算法模板
32 0
|
5月前
|
算法 安全 数据挖掘
解锁编程之门:数论在算法与加密中的实用应用
解锁编程之门:数论在算法与加密中的实用应用
|
6月前
|
算法
简记二分算法模板与代码案例:整数二分和浮点数二分
本文介绍了两种算法模板,分别是整数二分和浮点数二分。
50 0