欧拉定理:若 \(gcd(a,n)=1\),\(a^{\varphi(n)}\equiv 1(mod\ n)\)

设 \(1\sim n-1\) 中与 \(n\) 互素的 \(\varphi(n)\) 个数 \(x_1,x_2,...,x_{\varphi(n)}\in M_1\),那么集合 \(M_1\) 为模 \(n\) 的一个缩系

再设 \(a\cdot x_1,a\cdot x_2,...,a\cdot x_{\varphi(n)}\in M_2\),由于缩系的性质,集合 \(M_2\) 也为模 \(n\) 的缩系

\[\Longrightarrow a\cdot x_1\cdot a\cdot x_2\cdot ...\cdot a\cdot x_{\varphi(n)}\equiv x_1,x_2,...,x_{\varphi(n)}(mod\ n)
\]

化简得 \(a^{\varphi(n)}\equiv 1(mod\ n)\)

如何求一个数的欧拉函数?让我们先证明另一个定理。


定理:\(\varphi(a)=a\cdot (1-\frac {1}{p_1})\cdot (1-\frac {1}{p_2})\cdot ...\cdot (1-\frac {1}{p_n})\)

  • 当 \(a=p\) 时,即 \(a\) 是素数,\(\varphi(a)=a-1\)

  • 当 \(a=p^k(k>1)\) 时,即 \(a\) 是一个素数幂,先考虑与 \(p^k\) 不互素的数 \(a(1\leq a\leq p^k)\),\(p^k\) 仅有因子 \(p\),所以 \(p|a\) 必定成立。所以 \(a\) 的值可以有 \(p,2p,3p,...,p^{k-1}\cdot p\),显然个数为 \(p^{k-1}\) 个。又知小于等于 \(a\) 的正整数总数为 \(p^k\) 个,所以 \(\varphi(a)=p^k-p^{k-1}=p^k\cdot (1-\frac {1}{p})\)

  • 当 \(a\) 为合数时,可表示为 \(a=p_1^{k_1}\cdot p_2^{k_2}\cdot ...\cdot p_n^{k_n}\),是多个素数幂的积。由 \(\varphi(nm)=\varphi(n)\cdot \varphi(m)\) 得 $$\varphi(a)=\varphi(p_1^{k_1})\cdot \varphi(p_2^{k_2})\cdot ...\cdot \varphi(p_n{k_n})=p_1{k_1}\cdot (1-\frac{1}{p_1})\cdot p_2^{k_2}\cdot (1-\frac {1}{p_2})\cdot ...\cdot p_n^{k_n}\cdot (1-\frac {1}{p_n})$$ 合并所有 \(p_i^{k_i}\) 等于 \(a\),证得 \(\varphi(a)=a\cdot (1-\frac {1}{p_1})\cdot (1-\frac {1}{p_2})\cdot ...\cdot (1-\frac {1}{p_n})\)

不少证明 \(\varphi(nm)=\varphi(n)\cdot \varphi(m)\) 都是一句话显然,所以有兴趣的话可以证明上述性质。

然后根据引理,可以在 \(O(\sqrt{n})\) 的时间内求出一个数的欧拉函数,这一般在不能线性筛出 \(\varphi\) 函数时使用。


扩展欧拉定理:

若 \(b<\varphi(m)\),\(a^b\equiv a^b(mod\ m)\)

若 \(b\geq \varphi(m)\),\(a^b\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}(mod\ m)\)

\(b\) 的指数部分可以边乘边模,最后对 \(a^b\) 线性求或者快速幂即可

\(Code\ Below:\)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a,m,b; inline ll read(ll m){
register ll x=0,f=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)){
x=x*10+ch-'0';
if(x>=m) f=1;
x%=m;ch=getchar();
}
return x+(f==1?m:0);
} ll phi(ll n){
ll ans=n,m=sqrt(n);
for(ll i=2;i<=m;i++){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) ans=ans/n*(n-1);
return ans;
} ll fast_pow(ll a,ll b,ll p){
ll ret=1;
for(;b;b>>=1,a=a*a%p)
if(b&1) ret=ret*a%p;
return ret;
} int main()
{
scanf("%lld%lld",&a,&m);
b=read(phi(m));
printf("%lld\n",fast_pow(a,b,m));
return 0;
}

题解 P5091 【【模板】欧拉定理】的更多相关文章

  1. 字符串 kmp算法 codeforce 625B 题解(模板)

    题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...

  2. CCF-CSP题解 201509-3 模板生成系统

    简单的替换一下字符串. 注意数组开大点. #include<bits/stdc++.h> const int maxm = 100; const int maxn = 100; using ...

  3. [洛谷P5091]【模板】欧拉定理

    题目大意:求$a^b\bmod m(a\leqslant10^9,m\leqslant10^6,b\leqslant10^{2\times10^7})$ 题解:扩展欧拉定理:$$a^b\equiv\b ...

  4. 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)

    [BZOJ3884]上帝与集合的正确用法(欧拉定理,数论) 题面 BZOJ 题解 我们有欧拉定理: 当\(b \perp p\)时 \[a^b≡a^{b\%\varphi(p)}\pmod p \] ...

  5. 【CodeForces】906 D. Power Tower 扩展欧拉定理

    [题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...

  6. 【刷题】洛谷 P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 \(S\) , 请你求出 \(S\) 的所有出现次数不为 \(1\) 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字 ...

  7. 牛客练习赛22-E.简单数据结构1(扩展欧拉定理降幂 +树状数组)

    链接:E.简单数据结构1 题意: 给一个长为n的序列,m次操作,每次操作: 1.区间加 2.对于区间,查询 ,一直到- 请注意每次的模数不同.   题解:扩展欧拉定理降幂 对一个数p取log(p)次的 ...

  8. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  9. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

随机推荐

  1. Windows 平台 (UWP)应用设计

    Make Your Apps Cooperate with Cross-App Communication :  https://rewards.msdn.microsoft.com/Challeng ...

  2. NOIP 2017 d2t2 70points

    革命之路漫漫 第一次尝试 40points spfa #include <bits/stdc++.h> #define read read() using namespace std; i ...

  3. oracle 替换字符 replace

    替换字符: select replace('xxyyzz','zz','') from dual >> xxyy   同时替换多个字符: select replace(replace('x ...

  4. idea 设置编译的编码方式

    Settings->Build,Execution,Deployment->Compiler->Java Compiler,右边的详情列表中,Javac Options有设置参数的地 ...

  5. js文件中获取${pageContext.request.contextPath}

    一般从 JSP文件中,可以直接使用 ${pageContext.request.contextPath}非常方便的获得当前页面的路径,用来处理被 Apache2代理之后出现 URL变化的问题,比如增加 ...

  6. Apache和nginx 域名配置

    apache配置 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windows\System32\drivers\etc目录下 2.在hosts文件里添加自己的域名配置,配置规则如 ...

  7. auto和decltype(c++11)

    1.auto 1)auto是一个类型说明符(类型说明符就是像int.double这样的),用来定义一个变量,它可以让编译器去分析表达式的类型,并使用该表达式的值去初始化变量 //auto定义的变量必须 ...

  8. Mybatis-Plus 实战完整学习笔记(四)------全局参数配置

    一.全局配置设置 (1)全局配置Id自动生成 <!--定义mybatisplus全局配置--> <bean id="globalConfig" class=&qu ...

  9. Kindeditor图片粘贴上传(chrome)

    kindeditor4.1.x版本已支持图片批量上传,不过传统的选文件上传的方式依然效率低下. 很多时候,编辑人员可能需要将一个文档中图片上传到网上,那么,按照传统的上传方法,他必须先将图片另存为到本 ...

  10. python读取并写入mat文件

    用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); save matData.mat 用python3读取并写入 ...