codeforece 768 B. Code For 1


B. Code For 1
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Jon fought bravely to rescue the wildlings who were attacked by the white-walkers at Hardhome. On his arrival, Sam tells him that he wants to go to Oldtown to train at the Citadel to become a maester, so he can return and take the deceased Aemon's place as maester of Castle Black. Jon agrees to Sam's proposal and Sam sets off his journey to the Citadel. However becoming a trainee at the Citadel is not a cakewalk and hence the maesters at the Citadel gave Sam a problem to test his eligibility.

Initially Sam has a list with a single element n. Then he has to perform certain operations on this list. In each operation Sam must remove any element x, such that x > 1, from the list and insert at the same position  sequentially. He must continue with these operations until all the elements in the list are either 0 or 1.

Now the masters want the total number of 1s in the range l to r (1-indexed). Sam wants to become a maester but unfortunately he cannot solve this problem. Can you help Sam to pass the eligibility test?

Input

The first line contains three integers nlr (0 ≤ n < 2500 ≤ r - l ≤ 105r ≥ 1l ≥ 1) – initial element and the range l to r.

It is guaranteed that r is not greater than the length of the final list.

Output

Output the total number of 1s in the range l to r in the final sequence.

Examples
input
7 2 5
output
4
input
10 3 10
output
5
Note

Consider first example:

Elements on positions from 2-nd to 5-th in list is [1, 1, 1, 1]. The number of ones is 4.

For the second example:

Elements on positions from 3-rd to 10-th in list is [1, 1, 1, 0, 1, 0, 1, 0]. The number of ones is 5.


///关键用好对称轴位置 递归即可

粗心卡了半天T_T

#include <algorithm>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>

using namespace std;

#define For(i,a,b) for(i=a;i<=b;i++)
#define _For(i,a,b) for(i=b;i>=a;i--)
#define Out(x) cout<<x<<endl
#define Outdouble(x,a) cout<<fixed<<setprecision(a)<<1.0*x<<endl
#define pf prllf
#define sf scanf
#define mset(arr,num) memset(arr,num,sizeof(arr))

#define ll long long
const ll inf = 1e12+10; ///
#define ok std::ios::sync_with_stdio(0)
#pragma comment(linker, "/STACK:102400000,102400000")

// #define debug
#if defined (debug)
---check---
#endif

/// ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^ ///
/*        10
    5     0      5
   212    0     212
101 1 101 0  101 1 101  可以观察到规律 关键记录对称轴位置
*/
ll cnt;
ll num[1010];

ll op(ll key)
{
    if(key == 0)
    {
        return 0;
    }
    if(key == 1)
    {
        return 1;
    }
    ll ans = 1;
    ll j = cnt;
    ll len = 1;

    while(len*2+1 <= key)
    {
        len=len*2+1;
        ans=ans*2+num[j]; ///加上对称轴元素
        j--;
    }
    ///关键 len不可能到达对称轴位置 一直是差一
    if(len == key) return ans;  ///正好计算完毕
    else if(key - len == 1) return ans + num[j]; ///如果实际长度与询问差1 那么加上对称轴位置的数
    else return (ans + num[j] +op(key % (len+1))); ///否则加上对称轴元素 取余 从头计算
}

int main()
{
    ll i,l,r;
    ll n,ans = 0;
    while(cin>>n>>l>>r)
    {
        cnt = 0;
        if(n == 0)
        {
            cout<<0<<endl;
            continue ;
        }
        else if(n == 1)
        {
            cout<<1<<endl;
            continue;
        }
        else
        {
            while(n>1)
            {
                cnt++; ///1~ans
                num[cnt] = n%2;
                n=n>>1;
            }
            cout<<op(r) - op(l-1)<<endl;
        }
    }
    return 0;
}

/**
903316762502 354723010040 354723105411
*/





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值