版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/86611138
正题
题目大意
定义函数
一次变化是将
求
之间有多少个数可以变化到
解题思路
其实就是
计算
减去
的
然后考虑倒推,若
因为
为整数,直接调出
那么当
且
枚举
,那么
的可取个数
当
为偶数时,有可能是由
变来的,需要特判。
#include<cstdio>
#define ll long long
using namespace std;
ll k,a,b,ans;
ll get_ans(ll x)
{
if(k<=1) return x;
ll z=1,ans=0;
while(z*k<=x){
ans+=z;
if(z*k+z-1>x) ans-=z*k+z-1-x;
z*=2;
}
return ans;
}
int main()
{
scanf("%lld%lld%lld",&k,&a,&b);
ans+=get_ans(b)-get_ans(a-1);
if(k&&!(k&1)) k++,ans+=get_ans(b)-get_ans(a-1);
printf("%lld",ans);
}