求2的n次方对1e9+7的模

news/2025/1/3 7:36:24/

问题引出

有如下问题:
2 n 2^n 2n mod (1e9+7),其中1< n < 1 0 100000 10^{100000} 10100000

首先明确一下此类问题的几种算法,首先朴素算法,即暴力循环求解,是O(N)复杂度,适用范围应该是n小于1000000;然后是快速幂算法,效率是O(log N),适用于n小于 2 100000 2^{100000} 2100000 级别的;然后就是上面的例题了,由于范围是 1 0 100000 10^{100000} 10100000 ,即使是快速幂也不可能在期望时间内解决,这时候需要另辟蹊径。

费马小定理

对于质数P,任意的自然数a,有: a p ≡ a ( m o d p ) a^p \equiv a (mod \,p) apa(modp)

主要思路

回到上述例题,可知 P 即1e9+7,这是个素数,满足费马小定理的条件。那么我们想提高 2^n 计算的效率,就绕不开减小 n 的大小,我们接下来就利用费马小定理来减少幂 n 的大小。

首先费马小定理的一个小变形: a ( P − 1 ) ≡ 1 ( m o d P ) a^{(P-1)} \equiv 1 (mod \,P) a(P1)1(modP) ,这个变形的前提是 a 不是 P 的倍数。

而 a 是 2 ,很明显 2 也是素数,所以GCD(a , P ) = 1,接下来对 2^n 进行变形: 2 n = 2 x ∗ ( P − 1 ) ∗ 2 k 2^n = 2^{x*(P-1)}* 2^k 2n=2x(P1)2k,而根据费马小定理,显然 2 x ∗ ( P − 1 ) m o d P = 1 m o d P 2^{x*(P-1)} mod\,P = 1 mod \,P 2x(P1)modP=1modP,于是 2 n m o d P = 2 k 2^n mod\,P= 2^k 2nmodP=2k,其中 k = n%(P-1)。此时 k 小于P,即小于 1e9+7,可以使用快速幂解决。

注意: 值得注意的是,10^100000 最大是1后面有100000个0,需要用字符串存,在转化为整数时利用模运算规则,边转化边取模。

代码示例

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
const int M = 1e9+7;
typedef long long ll;
ll qpow(ll a,ll b){ll res = 1;while(b){if(b&1) res = res*a%M;a = a*a%M;b >>= 1;}return res;	
}
ll solve(string x){ll M1 = M-1;ll k = x[0]-'0';for(int i = 1;x[i];i++) k = (k*10+x[i]-'0')%M1;ll ans = qpow(2,k); return ans%M;
}
int main(){string n;while(cin >> n && n != "0"){printf("%lld\n",solve(n));}return 0;
}

问题拓展

a b m o d P a^b mod P abmodP 的值,其中 P 为质数,a 为整数,并且 b 是位数小于2000的整数。

解题思路

由欧拉定理可得 a φ ( P ) ≡ 1 ( m o d P ) a^{\varphi(P)} \equiv 1 (mod P) aφ(P)1(modP) ,欧拉定理成立的条件只要求 a 与 P 互质即可。

若 a 与 P 不互质,将 a 拆分为若干素因数的乘积,即 a = P k 0 p 1 k 1 p 2 k 2 . . p m k m a = P^{k_0} p_1^{k_1}p_2^{k_2}..p_m^{k_m} a=Pk0p1k1p2k2..pmkm 这时候 a 的质因数里一定存在 P ,剩下的质因数都与 P 互质。而 P k 0 m o d P ≡ 1 ( m o d P ) P^{k_0} mod P \equiv 1 (mod P) Pk0modP1(modP) ,因此质因数 P 对结果无影响,只需考虑剩下的质因数 p 1 k 1 p 2 k 2 . . p m k m p_1^{k_1}p_2^{k_2}..p_m^{k_m} p1k1p2k2..pmkm

p 1 k 1 p 2 k 2 . . p m k m p_1^{k_1}p_2^{k_2}..p_m^{k_m} p1k1p2k2..pmkm 与 P 都是互质的,由欧拉定理可知 a φ ( P ) m o d P = p 1 k 1 φ ( P ) p 2 k 2 φ ( P ) . . p m k m φ ( P ) m o d P ≡ 1 a^{\varphi (P)} mod P = p_1^{{k_1}\varphi(P)}p_2^{{k_2}\varphi(P)}..p_m^{{k_m}\varphi(P)} mod P \equiv 1 aφ(P)modP=p1k1φ(P)p2k2φ(P)..pmkmφ(P)modP1 ,若 b = l φ ( P ) + r b = l\varphi(P) + r b=lφ(P)+r,则 a b m o d P = a r m o d P a^b mod P = a^r mod P abmodP=armodP

综上所述,对于任意的 a,b,P, a b m o d P = a b m o d φ ( P ) m o d P a^b mod P = a^{b\:mod\varphi(P)} mod P abmodP=abmodφ(P)modP

其中 φ ( P ) \varphi(P) φ(P) 为欧拉函数。

至此解题步骤就清晰了,只需要先让超大数 b 对 φ ( P ) \varphi(P) φ(P) 取模 得到 r,然后计算 a r m o d P a^r mod P armodP 即可。同时可见,求 2 b 2^b 2b 的方法只是一个特例,因为素数 P 的欧拉函数值 φ ( P ) = P − 1 \varphi(P) = P-1 φ(P)=P1


http://www.ppmy.cn/news/678499.html

相关文章

常见进制转换

常见进制转换 一. 进制概述 进制也就是进位计数制&#xff0c;是人为定义的带进位的计数方法&#xff08;有不带进位的计数方法&#xff0c;比如原始的结绳计数法&#xff0c;唱票时常用的“正”字计数法&#xff0c;以及类似的tally mark计数&#xff09;。 对于任何一种进制…

Shell中的流程控制(if/case/for/while)

文章目录 Shell中的流程控制&#xff08;if/case/for/while&#xff09;1 if判断1.1 单分支1.2 多分支 2. case语句3 for循环3.1 第一种写法 (())3.2 第二种写法 in 4 while循环4.1 demo14.2. demo2测试let Shell中的流程控制&#xff08;if/case/for/while&#xff09; 1 if判…

VRP基础操作

目录 一、华为VRP 1.1、VRP介绍 1.2、设备管理接口 1.3、Console口登录 1.4、参数配置 二、华为VRP命令行基础 2.1、真机设备初始化启动 2.2、命令行视图 2.3、命令行功能 2.4、命令行在线帮助 2.5、配置系统时钟 2.6、配置标题消息 2.7、命令等级 2.8、用户界面…

Java_Learning

Java实战 21例 文章目录 第一章 类与对象1.1 面向对象面向对象三个主要特征&#xff1a; 1.2 类与对象1.3 对象内存分析1.4 对象引用分析1.5 引用与垃圾产生分析1.6.1 成员属性封装处理1.6.2 **this**有三种用法&#xff1a;1.7 构造方法与匿名对象1.8 简单Java类&#xff08;超…

日本选购键盘

今天去日本秋叶原电器商城闲逛。发现这里的电器还是挺便宜的。 于是萌生了想买一个机械键盘的冲动。但是挑来挑去。也就是罗技、微软、雷蛇、黑寡妇、FILCO这几个牌子。 主要还是罗技的天下&#xff0c;整整一排都是罗技的键盘鼠标耳机什么的。但是也没看见什么人选。罗技没有…

客制化键盘编程_装机单推荐 篇二:垃圾佬的第一个客制化键盘---gk64升级版

装机单推荐 篇二&#xff1a;垃圾佬的第一个客制化键盘---gk64升级版 2019-09-09 11:55:42 24点赞 89收藏 25评论 你是AMD Yes党&#xff1f;还是intel和NVIDIA的忠实簇拥呢&#xff1f;最新一届#装机大师赛#开始啦&#xff01;本次装机阵营赛分为3A红组、intel NVIDIA蓝绿组、…

2023-07-01 用C语言把科学计数法转换为普通数字,使用double value; sscanf(str, “%lf“, value );就可以做到。

一、在科学计数法中&#xff0c;为了使公式简便&#xff0c;可以用带 “E” 的格式表示。例如 1.09乘10的7次方&#xff0c;可简写为 “1.09E07” 的形式&#xff0c;其中 ”E“ 是 exponent(指数) 的缩写&#xff0c;可以不区分e的大小写&#xff0c;用e或者E都可以。 二、比…

vue+leaflet笔记之地图卷帘

vueleaflet笔记之地图卷帘 本文介绍了Web端使用Leaflet开发库实现地图卷帘效果的方法 (底图来源:中科星图)&#xff0c;结合leaflet-side-by-side插件可以快速简单地实现地图分屏对比效果 &#xff0c;示例效果如下图所示。 开发环境 Vue开发库&#xff1a;3.2.37 & Leaf…