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的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)

CodeForces 931F Teodor is not a liar!

这个c代码有啥问题?