2015.12 杭电校赛 Bitwise Equations

http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=657&pid=1005

题意:给你一个X,一个K,求第K个小的Y使他满足 X|Y=X+Y;

解法:此题可由打表找规律;找到的规律是,当原数的1全部变成0,其余的零 所排列组合的 出的数都是可行的解,所以,k的值就是那些零排列组合成的值,所以

把原数里的1变成0,只把 k插入进去。

AC代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <math.h>
 5 using namespace std;
 6 int main()
 7 {
 8     int T,a[150],b[150],x,k;
 9     scanf("%d",&T);
10     while(T--)
11     {
12         scanf("%d%d",&x,&k);
13         int a1=0;
14         int b1=0;
15         while(x)//转换成二进制
16         {
17             a[a1++]=x%2;
18             x/=2;
19         }
20         while(k)//转换成二进制
21         {
22             b[b1++]=k%2;
23             k/=2;
24         }
25         int c1=0;
26         for(int i=0;i<a1;i++)//将k插入进去
27         {
28             if(a[i]==0&&c1<b1)
29             {
30                 a[i]=b[c1++];
31             }
32             else if(a[i]==1)
33             {
34                 a[i]=0;
35             }
36         }
37         while(c1<b1)//如果k比x大的话就需要这步
38         {
39             a[a1++]=b[c1++];
40         }
41         long long int sum=1;
42         long long int s=0;
43         for(int i=0;i<a1;i++)//将二进制转换成十进制
44         {
45             s+=sum*a[i];
46             sum*=2;
47         }
48         printf("%lld
",s);
49     }
50     return 0;
51 }
原文地址:https://www.cnblogs.com/qioalu/p/5079035.html