题目网址:http://codeforces.com/contest/1151/problem/C
题目大意:给定奇数集和偶数集,现构造一个数组,先取奇数集中一个元素1,再取偶数集二个元素2,4,再取奇数集四个元素3,5,7,9,再取偶数集八个元素,6,8,10……
得到 1,2,4,3,5,7,9,6,8,10,12……问这个数组的某一区间和是多少,并对1e9+7取模。
题解:对于奇数集x和偶数集y的前k项,有x=k^2,y=k*(k+1),首先,计算区间和,可以用前缀和,当计算前n项的和时,只需判断前n项有多少个奇数和偶数即可,要注意取模作差的时候可能出现负数的情况。
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int mod=1e9+7; 5 ll cal(ll x) 6 { 7 ll odd=0,even=0,flag=1,c=1; 8 while(x) { 9 if(flag==1) { 10 odd+=min(c,x);x-=min(x,c); 11 } 12 else { 13 even+=min(c,x);x-=min(x,c); 14 } 15 flag=-flag;c<<=1; 16 } 17 ll ans=(odd%mod)*(odd%mod)%mod+(even%mod)*((even+1)%mod)%mod; 18 return ans%mod; 19 } 20 int main() 21 { 22 ll l,r; 23 cin>>l>>r; 24 cout<<(cal(r)-cal(l-1)+mod)%mod<<endl; 25 }