题目描述

给你三个正整数,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^91a1091≤b≤1020000000,1≤m≤1081\le b \le 10^{20000000},1\le m \le 10^81b10200000001m108

1. 剩余类、完全剩余系、简化剩余系

  • 剩余类:模 mmm 的两个整数若差为 mmm 的倍数,则它们属于同一个剩余类。
    即:若 a≡b(modm)a \equiv b \pmod mab(modm),则 aaabbb 属于同一个剩余类。
  • 完全剩余系:模 mmmmmm 个两两不全同余的整数集合。
    例如:0,1,2,…,m−1{0, 1, 2, \dots, m-1}0,1,2,,m1 是模 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 ap11(modp)

解释
当模数是质数 ppp 时,任意与 ppp 互质的整数 aaa(p−1)(p-1)(p1) 次方对 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)

解释
这是费马小定理的推广。它说明当 aaammm 互质时,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),即可得到等价的指数。
    这在 快速幂取模循环节优化 中十分常用。

定理

对于任意整数 aaannnb≥ϕ(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} ababmodϕ(n)+ϕ(n)(modn)

适用条件

  • aaannn 互质时,退化为欧拉定理:aϕ(n)≡1(modn)a^{\phi(n)} \equiv 1 \pmod{n}aϕ(n)1(modn)
  • aaannn 不互质时,需满足 b≥ϕ(n)b \geq \phi(n)bϕ(n) 才能直接应用。

示例

问题:计算 2100mod  122^{100} \mod 122100mod12
步骤

  1. 计算 ϕ(12)=ϕ(4)ϕ(3)=2×2=4\phi(12) = \phi(4)\phi(3) = 2 \times 2 = 4ϕ(12)=ϕ(4)ϕ(3)=2×2=4
  2. 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} 21002100mod4+420+4164(mod12)

题解

#include 
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=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<>t;
    while(t--)
    {
        solve();
    }
    return 0;
}