简单提一下做法,注意到 ,所以 只会是 或 ,取决于 的就行,于是求一个 product 即可。
接下来是这篇题解的重点,聚焦 做补充。
不妨从二项式乘法的角度来看,举例 ,不妨将 看作是选择,将 看作是不选择,那么一个长度为 的二进制数即可表示出这个乘积所有的状态,不妨设这个状态为 ,注意到 对答案的贡献是在做加法,并且因为类似 的指数相加正好可以凑出 ,所以 的贡献就是 ,得证。
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";
}