CodeForces - 1151C
Posted 吃花椒的妙酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 1151C相关的知识,希望对你有一定的参考价值。
传送门
题目大意:当i为奇数时,从奇数中取2^i个数(从小到大)放入序列中,当i为偶数时,从偶数中取2^i个数(从小到大)放入序列中,现在给定区间[l,r],问区间和
思路:数学,模拟
老实模拟放数就行,前n个奇数和为n*n,前n个偶数和为n(n+1),注意n*n时要用快速乘,1e9*1e9可能会爆longlong,还有一个注意点是位运算1<<(num-1),因为默认位运算范围是int ,所以这里num如果超过31就会出错,要将1转为longlong再做位运算,即(longlong)1<<(num-1)
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(x,y) memset(x,y,sizeof(x))
#define all(v) v.begin() , v.end()
#define pb(v) push_back(v)
#define INF 0x3f3f3f3f
#define int long long
#define lson p*2,l,mid
#define rson p*2+1,mid+1,r
typedef long long ll;
const int N = 1e6+10;
const int mod = 1e9+7;
int n,l,r;
ll mul(ll a,ll b)
{
ll ans=0,temp=a;
while( b )
{
if( b&1 ) ans = (ans + temp) %mod;
temp = (temp<<1)%mod;
b>>=1;
}
return ans;
}
int getit(int a)
{
int num=0;//2的幂次
int odd=0,even=0;
//每次减去2的幂次
while( a>0 )
{
num++;
int temp = (ll)1<<(num-1);
if( (num)&1 ) odd += min(1ll*a,1ll*temp);
else even += min(1ll*a,temp);
a -= 1ll*1<<(num-1);
}
ll ans = (mul(odd,odd) + mul(even,even+1))%mod;
return ans;
}
void solve()
{
cout<<(getit(r)-getit(l-1)+mod)%mod<<endl;
}
signed main()
{
//!!!!!!!!!!!!!!!!!!!!!!
// freopen("data.txt","r",stdin);
//!!!!!!!!!!!!!!!!!!!!!!
IOS;
cin>>l>>r;
solve();
}
以上是关于CodeForces - 1151C的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 86C Genetic engineering(AC自动机+DP)
CodeForces 1005D Polycarp and Div 3(思维贪心dp)
(Incomplete) Codeforces 394 (Div 2 only)