In mathematics you don't understand things, you just get used to them.

link。

简单提一下做法,注意到 $k^{2^a}\equiv k^{2^b}\equiv-1\equiv (-1)^{2^{b-a}}=1\pmod{(k^{2^a}+1,k^{2^{b}}+1)}$,所以 $\gcd$ 只会是 $1$ 或 $2^{r-l}$,取决于 $k$ 的就行,于是求一个 product 即可。

接下来是这篇题解的重点,聚焦 $\displaystyle \prod\left(k^{2^i}+1\right)=\sum_{i=0}^{2^{r-l+1}-1}\left(k^{2^l}\right)^i$ 做补充。

不妨从二项式乘法的角度来看,举例 $\left(k^{2^i}+1\right)\left(k^{2^j}+1\right)\left(k^{2^w}+1\right)$,不妨将 $k^{2^x}$ 看作是选择,将 $1$ 看作是不选择,那么一个长度为 $r-l+1$ 的二进制数即可表示出这个乘积所有的状态,不妨设这个状态为 $S$,注意到 $S$ 对答案的贡献是在做加法,并且因为类似 $2^i+2^j+2^w$ 的指数相加正好可以凑出 $S$,所以 $S$ 的贡献就是 $\left(k^{2^l}\right)^S$,得证。

void executer() {
    int k, p;
    LL l, r;
    cin >> k >> l >> r >> p;
    SetMod(p-1);
    int e = qpow(2, l), e2 = qpow(2, r-l+1);
    SetMod(p);
    int K = k%p ? qpow(k, e) : 0, ans;
    if (K == 0) {
        ans = 1;
    }
    else {
        if (K == 1) {
            ans = qpow(2, r-l+1);
        }
        else {
            ans = mul(sub(qpow(K, e2), 1), inv(sub(K, 1)));
        }
    }
    if (k%2) {
        mul_eq(ans, inv(qpow(2, r-l)));
    }
    cout << ans << "\n";
}

number theory combinatorics

「codeforces - 1486F」Pairs of Paths
上一篇 «
基础数论再理解
» 下一篇