Solution -「CF 185D」Visit of the Great

cirnovsky /

link。

简单提一下做法,注意到 k2ak2b1(1)2ba=1(mod(k2a+1,k2b+1))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\gcd 只会是 112rl2^{r-l},取决于 kk 的就行,于是求一个 product 即可。

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

不妨从二项式乘法的角度来看,举例 (k2i+1)(k2j+1)(k2w+1)\left(k^{2^i}+1\right)\left(k^{2^j}+1\right)\left(k^{2^w}+1\right),不妨将 k2xk^{2^x} 看作是选择,将 11 看作是不选择,那么一个长度为 rl+1r-l+1 的二进制数即可表示出这个乘积所有的状态,不妨设这个状态为 SS,注意到 SS 对答案的贡献是在做加法,并且因为类似 2i+2j+2w2^i+2^j+2^w 的指数相加正好可以凑出 SS,所以 SS 的贡献就是 (k2l)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";
}