0
点赞
收藏
分享

微信扫一扫

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:

B. Code For 1_ios

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:

B. Code For 1_#include_02

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 条评论