P5091 【模板】扩展欧拉定理
题目描述
给你三个正整数,a,m,ba,m,ba,m,b,你需要求:ab mod ma^b \bmod mabmodm
输入格式
一行三个整数,a,m,ba,m,ba,m,b
输出格式
一个整数表示答案
输入输出样例 #1
输入 #1
2 7 4
输出 #1
2
输入输出样例 #2
输入 #2
998244353 12345 98765472103312450233333333333
输出 #2
5333
说明/提示
注意输入格式,a,m,ba,m,ba,m,b 依次代表的是底数、模数和次数
【样例 111 解释】
24 mod 7=22^4 \bmod 7 = 224mod7=2
【数据范围】
对于 100%100\%100% 的数据,1≤a≤1091\le a \le 10^91≤a≤109,1≤b≤1020000000,1≤m≤1081\le b \le 10^{20000000},1\le m \le 10^81≤b≤1020000000,1≤m≤108。
1. 剩余类、完全剩余系、简化剩余系
- 剩余类:模 mmm 的两个整数若差为 mmm 的倍数,则它们属于同一个剩余类。
即:若 a≡b(modm)a \equiv b \pmod ma≡b(modm),则 aaa 与 bbb 属于同一个剩余类。 - 完全剩余系:模 mmm 的 mmm 个两两不全同余的整数集合。
例如:0,1,2,…,m−1{0, 1, 2, \dots, m-1}0,1,2,…,m−1 是模 mmm 的一个完全剩余系。 - 简化剩余系:模 mmm 下与 mmm 互质的数所组成的集合。其元素个数为 φ(m)\varphi(m)φ(m)。
2. 费马小定理(Fermat’s Little Theorem)
若 ppp 为质数,且 gcd(a,p)=1\gcd(a, p) = 1gcd(a,p)=1,则
ap−1≡1(modp) a^{p-1} \equiv 1 \pmod p ap−1≡1(modp)
解释:
当模数是质数 ppp 时,任意与 ppp 互质的整数 aaa 的 (p−1)(p-1)(p−1) 次方对 ppp 取模等于 111。
这是欧拉定理的特殊情形(当 m=pm=pm=p 时)。
3. 欧拉定理(Euler’s Theorem)
若 gcd(a,m)=1\gcd(a, m) = 1gcd(a,m)=1,则
aφ(m)≡1(modm) a^{\varphi(m)} \equiv 1 \pmod m aφ(m)≡1(modm)
解释:
这是费马小定理的推广。它说明当 aaa 与 mmm 互质时,aaa 的 φ(m)\varphi(m)φ(m) 次方在模 mmm 意义下同余于 1。
其中 φ(m)\varphi(m)φ(m) 表示欧拉函数,即 1~m 中与 m 互质的数的个数。
4. 扩展欧拉定理
ab≡{ab,b<φ(m), ab mod φ(m)+φ(m),b≥φ(m),( mod m) a^b \equiv \begin{cases} a^b, & b < \varphi(m), \ a^{b \bmod \varphi(m) + \varphi(m)}, & b \ge \varphi(m), \end{cases} \quad (\bmod m) ab≡{ab,b<φ(m), abmodφ(m)+φ(m),b≥φ(m),(modm)
解释:
当指数 bbb 很大时,可以利用欧拉函数进行降幂计算:
- 若 b<φ(m)b < \varphi(m)b<φ(m),直接计算 ab mod ma^b \bmod mabmodm。
- 若 b≥φ(m)b \ge \varphi(m)b≥φ(m),则先将指数对 φ(m)\varphi(m)φ(m) 取模,再加上 φ(m)\varphi(m)φ(m),即可得到等价的指数。
这在 快速幂取模 与 循环节优化 中十分常用。
定理
对于任意整数 aaa、nnn 和 b≥ϕ(n)b \geq \phi(n)b≥ϕ(n),其中 ϕ(n)\phi(n)ϕ(n) 是欧拉函数,满足:
ab≡abmod ϕ(n)+ϕ(n)(modn)
a^b \equiv a^{b \mod \phi(n) + \phi(n)} \pmod{n}
ab≡abmodϕ(n)+ϕ(n)(modn)
适用条件
- 当 aaa 与 nnn 互质时,退化为欧拉定理:aϕ(n)≡1(modn)a^{\phi(n)} \equiv 1 \pmod{n}aϕ(n)≡1(modn)。
- 当 aaa 与 nnn 不互质时,需满足 b≥ϕ(n)b \geq \phi(n)b≥ϕ(n) 才能直接应用。
示例
问题:计算 2100mod 122^{100} \mod 122100mod12。
步骤:
- 计算 ϕ(12)=ϕ(4)ϕ(3)=2×2=4\phi(12) = \phi(4)\phi(3) = 2 \times 2 = 4ϕ(12)=ϕ(4)ϕ(3)=2×2=4。
- 因 b=100≥ϕ(12)b = 100 \geq \phi(12)b=100≥ϕ(12),应用扩展欧拉定理:
2100≡2100mod 4+4≡20+4≡16≡4(mod12) 2^{100} \equiv 2^{100 \mod 4 + 4} \equiv 2^{0+4} \equiv 16 \equiv 4 \pmod{12} 2100≡2100mod4+4≡20+4≡16≡4(mod12)
题解
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
string s;
ll a,m;
ll get_phi(ll m)
{int res = m;for(int i=2;i*i<=m;i++){if(m%i==0){res =res/i*(i-1);while(m%i==0)m/=i;}}if(m>1)res = res/m*(m-1);return res;
}ll depow(ll phi_m)
{ll b = 0;bool flag = false;ll sz = s.size();for(int i=0;i<sz;i++){b = b*10+s[i]-'0';if(b>=phi_m){flag=true;b%=phi_m;}}if(flag)b+=phi_m;return b;
}
ll qpow(ll a,ll b,ll p)
{ll res =1;for(;b;b>>=1){if(b&1)res = res*a%p;a = a*a%p;}return res;
}void solve()
{cin>>a>>m>>s;ll phi_m = get_phi(m);ll res = depow(phi_m);ll res2 = qpow(a,res,m)%m;cout<<res2<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;// cin>>t;while(t--){solve();}return 0;
}
