题目链接:https://vjudge.net/problem/CodeForces-1151C
转自:https://blog.csdn.net/weixin_43824158/article/details/89409790
题意:一串序列:1 2 4 3 5 7 9 6 8 10 12 14 16 18 11……,求L,R区间和。
思路:对于奇数数列的前n项和为n^2,前n项和为n*(n+1).则根据题目的奇偶排列顺序对于奇偶分别加值即可。注意快速乘。
一个玄学的地方就是 cnt1=cnt1+min(bor,(long long)1<<num);其中1<<num不能加括号否则就很慢。
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long qsc(long long a,long long b)
{
long long ans=0;
while(b)
{
if(b&1)
ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans%mod;
}
long long solve(long long bor)
{
long long cnt1=0,cnt2=0;
long long num=0;
while(bor>0)
{
if(num%2)
{
cnt1=cnt1+min(bor,(long long)1<<num);
}
else
{
cnt2=cnt2+min(bor,(long long)1<<num);
}
bor-=(long long)1<<num;
num++;
}
return (qsc(cnt2,cnt2)+qsc(cnt1,cnt1+1))%mod;
}
int main()
{
long long l,r;
cin>>l>>r;
cout<<(solve(r)-solve(l-1)+mod)%mod;
return 0;
}