Codeforces Round #553 (Div. 2) C题

题目网址: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 }  
View Code

猜你喜欢

转载自www.cnblogs.com/duxing201806/p/10778304.html