题解 | 2023 年牛客多校第九场 B 题题解

Semi-Puzzle: Brain Storm

https://ac.nowcoder.com/acm/contest/57363/B

题意:给定 a,ma,m,构造一个非负整数 uu,使得 auu(modm)a^u \equiv u \pmod m1a<m1091 \le a<m \le 10^90u10180 \le u \le 10^{18}。多测,1T1031 \le T \le 10^3

解法:首先定义记号 a^\infty a 表示 aaaa^{a^{a^\cdots}},即 aa 叠无穷多层指数塔。首先不难注意到一个最简单的性质:

aa=aa^{^\infty a}=^\infty a

这个数字显然是不可计算的无穷大,但是考虑在模意义下,由于模运算内参与运算的元素个数有限,并且由下面的扩展欧拉定理:

ab{abmodφ(m),gcd(a,m)=1ab,gcd(a,m)1,bφ(m)abmodφ(m)+φ(m),gcd(a,m)1,b>φ(m)a^b\equiv \begin{aligned} \begin{cases} a^{b \bmod \varphi(m)}, &\gcd(a,m)=1\\ a^b, &\gcd(a,m) \ne1, b \le \varphi(m)\\ a^{b \bmod \varphi(m)+\varphi(m)}, &\gcd(a, m) \ne 1, b>\varphi(m) \end{cases} \end{aligned}

这个 a^\infty a 一定在模意义下对应一个唯一确定的整数。下文中讨论 a^\infty a 的值,一定是针对于某个特定的模数而言。

由扩展欧拉定理可得,要想求 amodm^\infty a \bmod m,考虑使用扩展欧拉定理。显然 a^\infty a 充分大,因而有:

aaamodφ(m)+φ(m)(modm)^\infty a \equiv a^{^\infty a \bmod \varphi(m)+\varphi(m)} \pmod m

而对于任意一个数字 mm,不断对它求 φ(m)\varphi(m),不超过 O(2logm)\mathcal O(2 \log m) 次操作就可以使 m=1m=1,这时 a0(mod1)^\infty a \equiv 0 \pmod 1,因而更高次指数不再有意义,因而可以通过下面的递归函数求出 amodm^\infty a \bmod m 的值。本题即P4139 上帝与集合的正确用法

long long dfs(long long base, long long p)
{
    if (p == 1)
        return 0;
    long long phip = phi(p);
    long long y = power(base, dfs(base, phip) + phip, p);
    return y;
}

下面开始对本题的正式解法描述。

法一:首先考虑 auu(modm)a^u \equiv u \pmod m 的形式。如果假设 uuaka^k 形式,则带入可得 aakak(modm)a^{a^k} \equiv a^k \pmod m。如果这个 uu 充分大(即大于 φ(m)\varphi(m)),则根据扩展欧拉定理的指数条件有 akk(modφ(m))a^k \equiv k \pmod{\varphi(m)},而这个式子与原式形式完全相同且模数减小,因而可以考虑一路递归下去,如此进行到 m=1m=1。这时考虑边界条件,不妨设此时的 uu 仍然具有 aka^k 形式,而这显然成立(模 11 意义下什么值都是 00)。因而,我们可以假定 uu 就是 a^\infty a

由于 a^\infty a 对于不同的模数就有不同的值,回到原式考虑这个 uu 需要满足什么条件。显然由最基本的条件,aa= au(modm)a^{^\infty a}=\ ^\infty a \equiv u \pmod m。此外,由于它在指数上,因而由 au a=aa(modm)a^u \equiv\ ^\infty a=a^{^\infty a} \pmod m 可得 u a(modφ(m))u \equiv\ ^\infty a \pmod {\varphi(m)}。注意这里的 uu 要充分大。因而可以得到如下的同余方程:

{u a(modm)u a(modφ(m))\begin{cases} u \equiv \ ^\infty a\pmod m\\ u \equiv \ ^\infty a \pmod{\varphi(m)} \end{cases}

因而有 u a(modlcm(m,φ(m)))u \equiv \ ^\infty a\pmod{{\rm lcm}(m, \varphi(m))}。考虑直接用上述方程组解 exCRT(扩展中国剩余定理)即可。因为 a(modlcm(φ(m),m))^\infty a \pmod{{\rm lcm}(\varphi(m), m)} 一定存在,因而上述同余方程组一定有解。复杂度 O(TV)\mathcal O\left(T \sqrt{V}\right)

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
ll mul(ll a, ll b, ll p) {
    ll r = a * b - (ll)((long double)a / p * b + 0.5) * p;
    return r < 0 ? r + p : r;
}
ll fpow(ll a, ll b, ll p, ll x = 1) {
    for (; b; b >>= 1, a = mul(a, a, p))
        if (b & 1) x = mul(x, a, p);
    return x;
}
int phi(int x) {
    int p = x;
    for (int i = 2; i * i <= x; i++) {
        if (x % i) continue;
        p -= p / i;
        while (x % i == 0) x /= i;
    }
    if (x > 1) p -= p / x;
    return p;
}
int A;
ll f(ll x) {
    if (x == 1) return 1;
    ll p = phi(x), lcm = p * x / __gcd(p, x);
    return fpow(A, f(p), lcm) + lcm;
}
void Solve() {
    int x;
    scanf("%d%d", &A, &x);
    ll w = f(x), d = (ll)x * phi(x) / __gcd(x, phi(x));
    printf("%lld\n", w >= 1e18 ? w % d : w);
}
int main() {
    int t = 1;
    scanf("%d", &t);
    while (t--) Solve();
    return 0;
}

法二:首先不难注意到当 gcd(a,m)=1\gcd(a,m)=1 时,aφ(m)1(modm)a^{\varphi(m)} \equiv 1 \pmod m。如果 φ(m)u\varphi(m)|uu1(modm)u \equiv 1 \pmod m 有解的时候这样的 uu 就是合法的。可惜这个同余方程组不一定有解。考虑让上述方程有解,即考虑一个一般情况,即 uu 仍然是充分大(大于 φ(m)\varphi(m))时,有 auac(modm)a^u \equiv a^c \pmod m,其中 cc 为一常数且 c[φ(m),2φ(m))c \in [\varphi(m),2\varphi(m))。则考虑指数和底数条件有:

uac(modm)uc(modφ(m))\begin{aligned} u &\equiv a^c \pmod m\\ u &\equiv c \pmod{\varphi(m)} \end{aligned}

消去 uu 将同余方程组转化为丢番图方程,观察对 cc 的约束,有:

ac+k1m=c+k2φ(m)a^c+k_1m=c+k_2\varphi(m)

acc=k1m+k2φ(m)a^c -c =k_1m+k_2\varphi(m),右侧必为 g=gcd(m,φ(m))g=\gcd(m,\varphi(m)) 的倍数。由于 k1,k2k_1,k_2 的任意性,右侧可以组合出一切 gg 的倍数,因而有 acc(modg)a^c \equiv c \pmod {g},就可以开始递归计算上述方程 cc 的解。对于每一轮递归,可以考虑暴力回代解出相应的 uu

全部评论

相关推荐

评论
9
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务