LG5901 【模板】欧拉定理
题意
题目描述
给你三个正整数,$a,m,b$,你需要求:
$a^b \mod m$
输入输出格式
输入格式:
一行三个整数,$a,m,b$
输出格式:
一个整数表示答案
输入输出样例
说明
注意输入格式,$a,m,b$ 依次代表的是底数、模数和次数
样例1解释:
$2^4 \mod 7 = 2$
输出2
数据范围:
对于全部数据:
$1≤a≤10^9$
$1≤b≤10^{20000000}$
$1≤m≤10^6$
分析
费马小定理
当 \(a,p\in \mathbb{Z}\) 且 \(p\) 为质数,且 \(a\not\equiv 0\pmod{p}\) 时有:
\(a^{p-1}\equiv 1\pmod{p}\) 。
所以 \(a^b\equiv a^{b\bmod (p-1)}\pmod p\) 。
欧拉定理
当 \(a,m\in \mathbb{Z}\) ,且 \(\gcd(a,m)=1\) 时有:
\(a^{\varphi(m)}\equiv 1\pmod{m}\) 。
这里 \(\varphi(x)\) 是数论中的欧拉函数。
所以 \(a^b\equiv a^{b\bmod \varphi(m)}\pmod m\) 。
扩展欧拉定理
当 \(a,m\in \mathbb{Z}\) 时有:
\(a^b\equiv\left\{\begin{matrix}a^b&,b<\varphi(m)\\a^{b\bmod\varphi(m)+\varphi(m)}&,b\ge\varphi(m)\end{matrix}\right.\pmod m\) 。
对于那个高精度整数,一边乘10相加,一遍取模即可。时间复杂度\(O(\sqrt m+\lg b+\log_2 m)\)
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
int main(){
int a=read<int>(),m=read<int>();
int phi=m,mm=m;
for(int i=2;i*i<=mm;++i)if(mm%i==0){
phi=phi/i*(i-1);
while(mm%i==0) mm/=i;
}
if(mm>1) phi=phi/mm*(mm-1);
int b=0,flag=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)){
b=b*10+ch-'0',ch=getchar();
if(b>=phi) b%=phi,flag=1;
}
if(b>=phi) b%=phi,flag=1;
if(flag) b+=phi;
int ans=1;
for(;b;b>>=1,a=(ll)a*a%m)
if(b&1) ans=(ll)ans*a%m;
printf("%d\n",ans);
return 0;
}
LG5901 【模板】欧拉定理的更多相关文章
- P5091 【模板】欧拉定理(欧拉降幂)
P5091 [模板]欧拉定理 以上3张图是从这篇 博客 里盗的,讲的比较清楚. #include<bits/stdc++.h> using namespace std; typedef l ...
- P5091 【模板】欧拉定理
思路 欧拉定理 当a与m互质时 \[ a^ {\phi (m)} \equiv 1 \ \ (mod\ m) \] 扩展欧拉定理 当a与m不互质且\(b\ge \phi(m)\)时, \[ a^b \ ...
- 题解 P5091 【【模板】欧拉定理】
欧拉定理:若 \(gcd(a,n)=1\),\(a^{\varphi(n)}\equiv 1(mod\ n)\) 设 \(1\sim n-1\) 中与 \(n\) 互素的 \(\varphi(n)\) ...
- [洛谷P5091]【模板】欧拉定理
题目大意:求$a^b\bmod m(a\leqslant10^9,m\leqslant10^6,b\leqslant10^{2\times10^7})$ 题解:扩展欧拉定理:$$a^b\equiv\b ...
- 【luoguP5091】【模板】欧拉定理
题目链接 欧拉定理: 当\(a\),\(m\)互质时,\(a^{\phi(m)}\equiv 1 (mod ~ m)\) 扩展欧拉定理: 当\(B>\phi(m)\)时,\(a^B\equiv ...
- 洛谷 P3811 【模板】乘法逆元(欧拉定理&&线性求逆元)
题目传送门 逆元定义 逆元和我们平时所说的倒数是有一定的区别的,我们平时所说的倒数是指:a*(1/a) = 1,那么逆元和倒数之间的区别就是:假设x是a的逆元,那么 a * x = 1(mod p), ...
- P5091 【模板】扩展欧拉定理
题目链接 昨天考试考到了欧拉公式,结果发现自己不会,就来恶补一下. 欧拉公式 \(a^b \bmod p = a^{b}\) \(b < \varphi(p)\) \(a^b \bmod p = ...
- uestc_retarded 模板
虽然这个队,以后再也没有了,但是他的模板,是永垂不朽的![误 #include <ext/pb_ds/priority_queue.hpp> __gnu_pbds::priority_qu ...
- Description has only two Sentences(欧拉定理 +快速幂+分解质因数)
Description has only two Sentences Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
随机推荐
- 初学Linux系统最应该做对的4件事情[长文]
“闲来无事,逛逛贴吧”已经是本人无事消磨时间的最佳选择了.五花八门的问题,各式各样的回答,总能给自己带来无限的欢乐.当然也有些问题值得自己去思考或者回答.之前就有人在贴吧里问到“Linux好难啊!该怎 ...
- 离线安装docker镜像
假如由于网络原因,需要在一台无网络的电脑上运行镜像,那么docker是支持的. 你需要做的主要有3步骤: 1:先从一个有网络的电脑下载docker镜像 sudo docker pull ubuntu ...
- 一个表中多个字段对应另一个表的ID(SQL查询)
A数据表中多个字段对应B数据表的ID, 现在要把B表的其他字段一起查询出来 一.数据表: 1.SPEED_DETECTION_ROAD 它的 START_POINT_ID 和 END_POINT_ID ...
- 关于Java的接口
其实刚开始听到接口的时候不解其意,为什么要有接口这个东西,加之老师上课我可能没仔细听(或者时间长了忘了?),这次看到了“用接口设计并实现圆,三角形,矩形的面积与周长计算”这个题目的代码,它将接口定义在 ...
- spring 配置 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Storm介绍&实际开发注意事项
一.使用组件的并行度代替线程池 Storm 自身是一个分布式.多线程的框架,对每个Spout 和Bolt,我们都可以设置其并发度:它也支持通过rebalance 命令来动态调整并发度,把负载分摊到多个 ...
- 互评Final版本
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2478] 基于NABCD评论作品,及改进建议 杨老师粉丝群.作品:<Pin ...
- 数据分析常用的python工具和SQL语句
select symbol, "price.*" from stocks :使用正则表达式来指定列查询 select count(*), avg(salary) from empl ...
- leetcode31题:下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- ios中 pickerView的用法
今天是一个特殊的日子(Mac pro 敲的 爽... 昨天到的) // // QRViewController.m// #import "QRViewController.h" @ ...