题意
定义函数
f
(
x
)
f(x)
f(x)为:
若
x
x
x为偶数,
f
(
x
)
=
x
/
2
f(x)=x/2
f(x)=x/2;
若
x
x
x为奇数,
f
(
x
)
=
x
−
1
f(x)=x-1
f(x)=x−1。
如果数
x
x
x在变化过程中
(
x
=
f
(
x
)
)
(x=f(x))
(x=f(x))出现
x
=
k
x=k
x=k,那么我们把
x
x
x叫做
k
k
k变变数,求出区间
l
∼
r
l\sim r
l∼r中
k
k
k变变数的个数。
思路
其实
f
(
x
)
=
⌊
x
/
2
⌋
f(x)=\left \lfloor x/2 \right \rfloor
f(x)=⌊x/2⌋,那么如果
2
n
k
+
x
2^nk+x
2nk+x为变变数,满足
⌊
2
n
k
+
x
2
n
⌋
=
k
\left \lfloor \frac{2^nk+x}{2^n} \right \rfloor=k
⌊2n2nk+x⌋=k
显然是
x
<
2
n
x<2^n
x<2n的,我们就可以枚举
x
x
x,那么每次可以贡献的答案数量就为
2
n
2^n
2n。
如果
k
k
k为偶数,我们还有
x
+
1
x+1
x+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));
}