题意
定义函数f(x)f(x)f(x)为:
若xxx为偶数,f(x)=x/2f(x)=x/2f(x)=x/2;
若xxx为奇数,f(x)=x−1f(x)=x-1f(x)=x−1。
如果数xxx在变化过程中(x=f(x))(x=f(x))(x=f(x))出现x=kx=kx=k,那么我们把xxx叫做kkk变变数,求出区间l∼rl\sim rl∼r中kkk变变数的个数。
思路
其实f(x)=⌊x/2⌋f(x)=\left \lfloor x/2 \right \rfloorf(x)=⌊x/2⌋,那么如果2nk+x2^nk+x2nk+x为变变数,满足
⌊2nk+x2n⌋=k\left \lfloor \frac{2^nk+x}{2^n} \right \rfloor=k⌊2n2nk+x⌋=k
显然是x<2nx<2^nx<2n的,我们就可以枚举xxx,那么每次可以贡献的答案数量就为2n2^n2n。
如果kkk为偶数,我们还有x+1x+1x+1转换过来的情况,所以答案要∗2*2∗2。
代码
#include<cstdio>
long long k, a, b;
long long ask(long long n) {
if (k <= 1) return n;
long long g = 1, ans = 0;
while (g * k <= n) {
ans += g;
if (g * k + g - 1 > n) ans -= g * k + g - 1 - n;//范围内
g *= 2;
}
if (!(k & 1)) ans *= 2;
return ans;
}
int main() {
scanf("%lld %lld %lld", &k, &a, &b);
printf("%lld", ask(b) - ask(a - 1));
}