codeforece 768 B. Code For 1

来源:互联网 发布:南京雨花台区网络问政 编辑:程序博客网 时间:2024/05/01 19:39


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 longconst 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     212101 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*/





1 0
原创粉丝点击