zoukankan      html  css  js  c++  java
  • Bitwise Equations

    Problem Description
    You are given two positive integers X and K. Return the K-th smallest positive integer Y, for which the following equation holds: X + Y =X | Y
    Where '|' denotes the bitwise OR operator.
     
    Input
    The first line of the input contains an integer T (T <= 100) which means the number of test cases. 
    For each case, there are two integers X and K (1 <= X, K <= 2000000000) in one line.
     
    Output
    For each case, output one line containing the number Y.
     
    Sample Input
    3
    5 1
    5 5
    2000000000 2000000000
     
    Sample Output
    2
    18
    16383165351936
     
     
    题目大意:X + Y =X | Y。给出X和一个数K,问能使该式成立的第k小的Y是多少。
    题目分析:要想使上式成立,X和Y必须没有交集。所以,此问题其实是求X的补集中第K小的子集是多少。
     
    代码如下:
    # include<iostream>
    # include<cstdio>
    # include<cmath>
    # include<string>
    # include<vector>
    # include<list>
    # include<set>
    # include<map>
    # include<queue>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    # define LL long long
    # define REP(i,s,n) for(int i=s;i<n;++i)
    # define CL(a,b) memset(a,b,sizeof(a))
    # define CLL(a,b,n) fill(a,a+n,b)
    
    const double inf=1e30;
    const int INF=1<<30;
    const int N=1000;
    
    unsigned long long n,k;
    
    const unsigned long long a=0xffffffffffffffff;
    unsigned long long ans;
    
    void dfs(unsigned x)
    {
        if(x<=0) return ;
        int t=x;
        int base=0;
        while(t){
            t/=2;
            ++base;
        }
        unsigned long long p=1;
        int id;
        for(int cnt=0,i=0;i<64&&cnt<=base;++i){
            id=i;
            if(n&(p<<i)){
                ++cnt;
                if(cnt==base) ans|=(p<<i);
            }
        }
        dfs(x-(p<<(base-1)));
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            cin>>n>>k;
            n=~n;
            ans=0;
            dfs(k);
            cout<<ans<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    Android Studio学习笔记(1)
    2019全国大学生电子设计大赛总结
    包与常用模块
    模块
    迭代器、生成器与递归调用
    叠加多个装饰器与有参数的装饰器。
    装饰器
    控制指针的移动、函数
    字符编码
    python 数据类型之列表、元组、字典、集合
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5078363.html
Copyright © 2011-2022 走看看