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 }