Binary system

Description

给定一个范围[a,b]  (0<=a<b<=10^18) 求出该范围内二进制中1的个数最多的数,如果存在多个答案,输出最小的那个数

Input

输入数据有多组,每组数据输入两个整数a,b,表示区间[a, b]。

Output

输出该区间内二进制的1最多的整数,如果有多个数二进制1的个数相同,输出最小的那个数。

Sample Input

4 8
7 14

Sample Output

7
7

思路:

区间[a,b],如果a==b,输出a, 先把a,b化为二进制数,每位分别保存到数组中,如果a的二进制位数小于b的位数,那么直接输出 2^(b的位数-1) -1(此处如果b等于 2^b的位数 -1 就直接输出b) ,也就是二进制数比b少一位且所有位均为1,如果a的位数等于b的位数,要求最小的符合题意的数,尝试着从a的二进制低位开始,如果是0,将其变为1,看是否小于等于b,如果是,继续操作,如果不是,退出。

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
ll n,m;
int nn[65],mm[65];
ll p[65];
void inti()
{
    p[0]=1;
    for(int i=1;i<63;i++)p[i]=p[i-1]<<1;
}
int getbit(ll x,int a[])
{
    int s=0;
    while(x)
    {
        a[s++]=x%2;
        x/=2;
    }
    return s;
}
int main()
{
    inti();
    while(~scanf("%lld%lld",&n,&m))
    {
        int lenn=getbit(n,nn);
        int lenm=getbit(m,mm);
        if(lenn<lenm){// input 3 7 output 7
            if(m==p[lenm]-1)printf("%lld\n",m);
            else printf("%lld\n",p[lenm-1]-1);
            continue;
        }
     //   printf("lenn=%d\n",lenn);
        for(int i=0;i<lenn;i++)
        {
            if(nn[i]==0)
            {
                //printf("** %lld %d\n",n,i);
                if(n+p[i]<=m)n+=p[i];
                else break;
            }
        }
        printf("%lld\n",n);
    }
    return 0;
}
				
时间: 2024-10-13 07:32:04

Binary system的相关文章

Binary system(求区间内二进制中1的个数最多的数)

Description 给定一个范围[a,b]  (0<=a<b<=10^18) 求出该范围内二进制中1的个数最多的数,如果存在多个答案,输出最小的那个数 Input 输入数据有多组,每组数据输入两个整数a,b,表示区间[a, b]. Output 输出该区间内二进制的1最多的整数,如果有多个数二进制1的个数相同,输出最小的那个数. Sample Input 4 87 14 Sample Output 77 HINT 思路: 区间[a,b],如果a==b,输出a, 先把a,b化为二进制数

hdu 2106 decimal system

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2106 decimal system Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3641    Accepted Submission(s): 2068 Problem Description As we know , we always

decimal system 2016

Problem Description As we know , we always use the decimal system in our common life, even using the computer. If we want to calculate the value that 3 plus 9, we just import 3 and 9.after calculation of computer, we will get the result of 12.But aft

十进制(decimal system)转换函数说明

一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12); //输出 1100 echo decbin(26); //输出 11010 decbin (PHP 3, PHP 4, PHP 5) decbin -- 十进制转换为二进制 说明 string decbin ( int number ) 返回一字符串,包含有给定 number 参数的二进制表示.所能转换的最大数值为十进制的 4294967295,其结果为

(HDUStep 1.2.6)decimal system(任意进制转十进制)

题目: decimal system Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3622 Accepted Submission(s): 1419   Problem Description As we know , we always use the decimal system in our common life, even us

求集合元素的所有非空子集

现有一个包含N个元素的集合S,求集合S的所有子集? 例如:集合S包含三个元素{a, b, c},则它的所有子集为:{ }(空集), {a}, {b}, {c}, {a, b}, {a, c}, {b, c} 和{a, b, c}. 这里先用位操作的思路来求解,具体方法:用2进制Bit位来标记集合中的某个元素是否被选中,1代表选中,0代表未选中.例如集合{a, b, c}的所有子集可如下表示: {a}                       0 0 1 {b}                 

hdu5335Walk Out

题意:给出一个01矩阵,从左上角走到右下角,问路径形成的二进制最小是多少. 这个题目很显然,但是我的做法还是很有意思的,于是写下. 很显然,为了去掉前导0的影响,首先爆搜出所有离终点最近的点然后压入队列开始爆搜,此时只需要往下往右走即可. 爆搜的时候每次处理出下一层的所有状态,若能够出现0,则不考虑其他为1的情况,这样只需要维护两个数组即可,很方便. #include<map> #include<string> #include<cstring> #include<

Instruction (hdu 5083)

Instruction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 163    Accepted Submission(s): 46 Problem Description Nowadays, Jim Green has produced a kind of computer called JG. In his computer,

[BZOJ4730][清华集训2016][UOJ266] Alice和Bob又在玩游戏

题意:俩智障又在玩游戏.规则如下: 给定n个点,m条无向边(m<=n-1),保证无环,对于每一个联通块,编号最小的为它们的根(也就是形成了一片这样的森林),每次可以选择一个点,将其本身与其祖先全部删除,不能操作者输.判断先手胜负. 题解:比较神的一道题. 我们现在要解决的问题是怎么求解一棵子树的SG值,首先把根删掉的情况考虑,这很好办,直接把子树的sg异或起来就好,关键是如果删除点在子树里怎么办. 这里用到了一个巧妙的东西,trie.怎么会用这个呢?因为删除子树里的节点就相当于是子树里这种对应的