模逆元简介

给定一个数 aa 和一个模 mmaa 在模 mm 意义下的逆元 a1a^{-1} 满足:

aa11(modm)a \cdot a^{-1} \equiv 1 \pmod{m}

如果我们想计算 ab\frac{a}{b} 在模 mm 意义下的结果,可以将其表示为:

abab1(modm)\frac{a}{b} \equiv a \cdot b^{-1} \pmod{m}

其中 b1b^{-1}bb 的模逆元。

计算模逆元

对于模数 mm 是质数的情况,我们可以使用费马小定理来计算模逆元。费马小定理指出:

bm11(modm)b^{m-1} \equiv 1 \pmod{m}

因此:

b1bm2(modm)b^{-1} \equiv b^{m-2} \pmod{m}

对于模 998244353998244353,可以通过快速幂算法来计算 b998244351b^{998244351} 来求得 bb 的逆元。

快速幂算法实现

以下是 C++ 代码,用于计算 aabb 次幂在模 mm 下的结果:

// 快速幂计算 a^b % m
long long mod_pow(long long a, long long b, long long m) {
    long long result = 1;
    a = a % m;
    while (b > 0) {
        if (b % 2 == 1) {
            result = (result * a) % m;
        }
        a = (a * a) % m;
        b /= 2;
    }
    return result;
}

// 计算 b 在模 m 下的逆元
long long mod_inverse(long long b, long long m) {
    return mod_pow(b, m - 2, m);
}

应用到问题中

在计算路径概率时,如果需要计算 wvsumu\frac{w_v}{sum_u},可以通过乘以 sumusum_u 的模逆元来实现:

// 计算概率时使用模逆元
long long sum_u_inverse = mod_inverse(sum_u, 998244353);
long long prob = (w_v * sum_u_inverse) % 998244353;

这样,我们就能在模 998244353998244353 的意义下正确地进行除法操作,从而保证计算结果符合题意。