光速幂

2023-05-16

warning:如果你还没有学过快速幂,请掉头先学快速幂因为快速幂的适用范围比这个东西更广

我们先回忆一下快速幂是怎么解决的
我们是利用二进制的性质将复杂度优化到单词询问 O ( log ⁡ i n d e x ) O(\log index) O(logindex)
但是在有些题目中,可能复杂度不支持我们再在原有复杂度上增加一个 log ⁡ \log log(比如询问变成 1 0 7 10^7 107次)
那么这个时候就需要运用到光速幂的内容了

当我们计算 a b   m o d   p a^b \bmod p abmodp的时候,我们可以令 b = k s + t b=ks+t b=ks+t,其中 s , t s,t s,t是常数, t ≤ s t\leq s ts
那么我们只需要预处理出任意一个 a 0 , a 1 , a 2 . . . a s a^0,a^1,a^2...a^s a0,a1,a2...as a 0 , a s , a 2 s , a 3 s . . . a ⌈ p s ⌉ s a^0,a^s,a^{2s},a^{3s}...a^{\lceil\frac{p}{s}\rceil s} a0,as,a2s,a3s...asps,那么最后询问答案就是 a k s × b t a^{ks}\times b^t aks×bt就可以 O ( 1 ) O(1) O(1)得到答案
那为什么我们的预处理的上界要取到 p p p呢?其实应该上界是 ϕ ( p ) \phi(p) ϕ(p),但是为了方便我们就算到 p p p
根据欧拉定理
a ϕ ( p ) ≡ 1     m o d   p a b ≡ a b   m o d   ϕ ( p )     m o d   p \begin{aligned} a^{\phi(p)}&\equiv 1\ &\bmod p \\ a^{b}&\equiv a^{b \bmod \phi(p)}\ &\bmod p \end{aligned} aϕ(p)ab1 abmodϕ(p) modpmodp
也就是说,对于任意的 a b a^b ab,一定有一个 a c ( c ≤ ϕ ( p ) ) a^c(c\leq\phi(p)) ac(cϕ(p))和他模 p p p同余

那么显然当 s s s ⌈ p ⌉ \lceil\sqrt p\rceil p 时可以做到不漏的情况下复杂度最优

那么我们直接处理出这些幂就可以了

下面给出的是洛谷模板题代码,记得指数要   m o d     ϕ ( p ) \bmod\ \phi(p) mod ϕ(p)

#include <bits/stdc++.h>
using namespace std;

# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)

typedef long long ll;

const int N=1e5+5;

template<typename T> void read(T &x){
   x=0;int f=1;
   char c=getchar();
   for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
   for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
    x*=f;
}

int a,b,p,bl;
int poww[N][2];

int phi(int x){
    int res=x;
    for(int i=2;i*i<=x;i++){
        if(x%i==0)res=res/i*(i-1);
        while(x%i==0)x/=i;
    }
    if(x>1)res=res/x*(x-1);
    return res;
}

int Qpow(int ind){
    ind%=phi(p);
    return 1ll*poww[ind%bl][0]*poww[ind/bl][1]%p;
}

signed main()
{
    read(a),read(b),read(p);
    bl=sqrt(p)+1;
    poww[0][0]=1;
    Rep(i,1,bl)poww[i][0]=1ll*poww[i-1][0]*a%p;
    poww[0][1]=1;
    Rep(i,1,bl)poww[i][1]=1ll*poww[i-1][1]*poww[bl][0]%p;
    printf("%d^%d mod %d=%d\n",a,b,p,Qpow(b));
    return 0;
}

下面简单的分析一下光速幂和快速幂的优点缺点

性能快速幂光速幂
时间复杂度单次询问 O ( log ⁡ b ) O(\log b) O(logb)预处理 O ( p ) O(\sqrt p) O(p ),询问 O ( 1 ) O(1) O(1)
空间复杂度$$
应用范围任何时候都可以使用只有在底数相同,模数相同时可以使用
码量比快速幂稍长(如果写 ϕ \phi ϕ的话)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

光速幂 的相关文章

  • centos7安装配置夜莺V5+睿象云实现电话短信告警

    服务器清单 hostnameipmaster192 168 8 128zabbix agen1192 168 8 134 master安装夜莺依赖 install prometheus mkdir p opt prometheus wget
  • (踩坑指南)cd .ssh返回-bash: cd: .ssh:No such file or directory怎么办

    1 cd ssh返回 bash cd ssh No such file or directory怎么办 出现如下界面 有时候没必要在细节上过于拘泥 xff0c 不如直接配置秘钥 xff0c 反而一切都妥妥的了 2 如何保存退出 xff1f
  • Python数据处理工具—去除TXT文件里面相同的数据

    前言 本次分享的是一个对TXT数据进行处理的一个小工具 xff0c 功能如题 xff0c 是把TXT里面相同的数据给清洗掉是剩下唯一的一个 一 数据 随便在文件里面写了一点数据 xff0c 可以看到里面有很多重复的数据 xff0c 那么里面
  • Python进行ffmpeg推流和拉流rtsp、rtmp

    流媒体协议 xff0c 英文学名Streaming Protocol xff0c 用一句人话来解释 xff1a 流媒体协议是一种用于通过 Web 传递多媒体的协议 传统视频流协议 xff1a RTMP和RTSP xff0c 其中 RTMP
  • ROS Python 入门学习笔记--1--工作空间与功能包的创建

    上一节我们已经成功安装了ROS xff0c 并且还进行了小海龟实验的一个初步探索 xff0c 这一节主要给大家介绍一下ROS工作空间与功能包的创建 先来聊一下ROS的文件结构 xff1a 图片来源 xff1a 中国大学MOOC 在ROS当中
  • python运算符&用法的详细介绍

    目录 1 算数运算 2 比较运算符 3 成员运算符 4 逻辑运算 5 赋值运算 附 xff1a 类型转换 1 算数运算 运算符 xff1a 43 加 减 乘 除 整除 余数 幂运算 多用于整数 浮点数进行计算 43 也可用于字符串 xff0
  • 第三篇 树莓派的串口通信和语音识别模块

    目录 一 串口 xff08 UART xff09 二 wiringPi提供的串口API 三 语音识别模块 1 阅读模块代码 代码阅读工具 xff1a Souces Insight4 0安装 激活 汉化等 语音识别 xff08 口令模式 xf
  • 安装配置 JupyterLab ubuntu20.04

    目录 编辑 xff08 1 xff09 安装 xff08 2 xff09 配置 xff08 1 xff09 生成配置文件 xff08 2 xff09 生成jupyterlab的登录密码 xff08 3 xff09 修改 jupyter 的配
  • 笔记本安装双系统(win11+centos7)自己遇到坑的总结

    笔记本安装CentOS操作系统 当初在学习CentOS7的时候 就想在自己的笔记本上装一个CentOS7 装CentOS7和Windows双系统 xff0c 安装的过程中也查阅很多资料但是都不是很齐全 xff0c 我将自己安装的全过程总结出
  • 平衡树·splay

    文章目录 1 About splay2 基本操作2 1 数组是干啥的 xff1f 2 2 基本操作 3 splay3 1 rotate函数3 2 splay函数 4 更新操作4 1 插入函数4 2 删除函数 5 查询操作5 1 查询一个数的
  • 删除双系统中的Linux系统(总结以及恢复U盘原样)

    一丶如何删除双系统中的Linux系统 xff08 这里的双系统是win 43 Linux xff09 第一步 首先打开磁盘管理器 xff0c 将要删除的Linux系统的主分区右键点击删除 xff0c 删除后就可以关闭磁盘管理器 第二步 在电
  • centos7安装docker

    一丶先了解下 xff0c 什么是 Docker xff1f 为什么会有 Docker xff1f Docker 的优势 xff1f docker的组成 xff1f 1 为什么会有 Docker xff1f 我们知道一款产品从开发到上线 xf
  • python Anaconda3-下载方法

    一 Anaconda 下载方法 方法一 xff1a 官网下载 xff08 速度特别慢 xff09 下载过程没有技巧 xff0c 全程next xff0c 在路径 上有些小问题解决方法如下 下载Anaconda官网 xff1a https w
  • sinx、cscx、cosx、secx以及tanx、cotx图像详解

    今天在复习三角函数一章中对正切正割等图像感觉比较有意思 xff0c 仔细梳理了以下内容 xff1a sin xff1a sine cos xff1a cosine sec xff1a secant csc xff1a cosecant 首先
  • Debian配置ssh服务

    安装SSH xff0c 工作端口监听在192101 apt install y ssh vim etc ssh sshd config 修改port 192101 仅允许InsideCli客户端进行ssh访问 xff0c 其余所有主机的请求
  • Debian配置DHCP服务及DHCP中继

    Ispsrv服务器上 xff1a Apt install y isc dhcp server 安装完成后 修改dhcp监听网卡 Vim etc default isc dhcp server INTERFACEv4 61 39 要监听的网卡
  • Debian配置NFS文件共享服务

    apt install y nfs kernel server nfs common vim etc exports 添加一条共享文件配置 仅允许AppSrv主机访问该共享 webdata 192 168 100 100 rw sync n
  • Debian搭建Discuz论坛

    论坛服务需要在apache或nginx代理服务已经配置好的情况下搭建 搭建LAMP架构 在前面已经搭建了apache 这里直接安装php apt install y php 安装完成后重启apache systemctl restart a
  • Debian配置ISCSI

    添加一块10G硬盘 apt install y targetcli fb lvm2 使用新增加的硬盘创建卷组 xff0c 名称为iscsivg xff0c 再创建iSCSI共享逻辑卷 xff0c 逻辑卷名称为iscsistore xff0c
  • 链表有序合并C++(头插法)

    include lt stdio h gt include lt stdlib h gt 单链表的存储结构 typedef struct Node int data struct Node next Node LinkList Node L

随机推荐