Codeforces Round #553 (Div. 2) C题

Posted duxing201806

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Codeforces Round #553 (Div. 2) C题的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #553 B. Dima and a Bad XOR

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

codeforces553C Love Triangles

Codeforces553E_CF553EKyoya and Train(概率_CDQ分治_FFT)

CF1151div2(Round 553)