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 n, l, r (0 ≤ n < 250, 0 ≤ r - l ≤ 105, r ≥ 1, l ≥ 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.

 

题意:给一个n, 不断的对n进行分解,即分解成{n/2,n%2,n/2},如提示对7分解成{1,1,1,1,1,1,1},再给一个范围,求这个范围出现的数的和。


解题思路:不知道大佬们怎么想的,说一下自己的想法,明显可以发现的这堆数是对称的,整体对称,局部也对称,那就先求一下它不断对2取余的结果吧,a[1],a[2],...,a[50]。放到题目里,就写出了这样的一组数


n = 7:a[1] = 1, a[2] = 1, a[1] = 1, a[3] = 1, a[1] = 1, a[2] = 1, a[1] = 1; a1出现了4次,a2出现了2次,a3出现了1次。


又写了个长的:a[1] , a[2] , a[1] , a[3] , a[1] , a[2] , a[1] , a[4], a[1], a[2], a[1], a[3], a[1], a[2], a[1], a[5]; a1出现了2^3, a2出现了2^2,a3出现了2^1,a4出现了2^0,a5出现了1次。这个规律可以用来求范围啊。只需记录范围是2的几次方,就开多少就行

 

 

 

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include <vector>
#include <map>

using namespace std;

const int inf = 0x3f3f3f3f;
const int Max = 100;
typedef long long  LL;
LL a[Max], b[Max];

LL get_num(LL x)
{
    LL i = 0;
    while(x/2 != 0)
    {
        a[i++] = x%2;
        x /= 2;
    }
    a[i] = 1;
    return i+1;
}

LL add(LL x, LL t)
{
    LL ans = 1;
    LL i, j = 0;
    for(i = t-1; i >= 0; i--)
    {
        b[j++] = a[i];
    }
    i = 0;
    while(ans*2<=x)
    {
        ans *= 2;
        for(int j = 0; j <= i; j++)
        {
            b[j] *= 2;
        }
        i++;
    }
    LL sum = 0;
     for(j = 0; j <= i; j++)
    {
        if(j != i)
        {
            sum += b[j]/2;
        }
        else
        {
            sum += b[j];
        }
    }
    if(x - ans != 0)
    {
        sum += add(x-ans, t);
    }
    return sum ;
}

int main()
{
    LL t;
    LL n, x, y;
    while(cin>>n)
    {
        cin>>x>>y;
        if(n == 0)
        {
            printf("0\n");
            continue;
        }
        if(n == 1)
        {
            printf("1\n");
            continue;
        }
        t = get_num(n);
        if(x - 1<=0)
            x = 0;
        else
            x = add(x-1, t);
        y = add(y, t);
        cout<<y-x<<endl;
    }
    return 0;
}
/*

 */1125899906842623 1 100001
100001
*/

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值