[规律]JZOJ 3084 超级变变变
分析
第一眼看题:不会吧别又是数论
再看一眼:不就是右移吗?
然后我们发现k变变数在二进制下都是有k的前缀的
所以计数也非常简单
唯一要注意的就是偶数:偶数还可以由偶数+1转来,所以偶数的要计算两次(不是乘二!虽然乘二也能过)
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; ll k,a,b; ll Calc(ll r) { ll mxn=0ll,ans=0ll,rr=r; if (r<k) return 0ll; while (rr>k) rr>>=1ll,mxn++; if (rr==k) ans+=r%(rr*(1ll<<mxn))+1ll; mxn--; for (int i=0;i<=mxn;i++) ans+=1ll<<i; return ans; } int main() { scanf("%lld%lld%lld",&k,&a,&b); if (k) printf("%lld\n",Calc(b)-Calc(a-1ll)+(!(k++%2ll)?Calc(b)-Calc(a-1ll):0)); else printf("%lld\n",b-a+1ll); }
在日渐沉没的世界里,我发现了你。