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项有多少个奇数和偶数即可,要注意取模作差的时候可能出现负数的情况。

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+;
ll cal(ll x)
{
ll odd=,even=,flag=,c=;
while(x) {
if(flag==) {
odd+=min(c,x);x-=min(x,c);
}
else {
even+=min(c,x);x-=min(x,c);
}
flag=-flag;c<<=;
}
ll ans=(odd%mod)*(odd%mod)%mod+(even%mod)*((even+)%mod)%mod;
return ans%mod;
}
int main()
{
ll l,r;
cin>>l>>r;
cout<<(cal(r)-cal(l-)+mod)%mod<<endl;
}
上一篇:Linux平台下线程池的原理及实现


下一篇:Java中native关键字