HDU计算机学院大学生程序设计竞赛(2015’12)1005 Bitwise Equations
题意:
已知x,k
求第k个使得x+y==x|y的正整数y
x+y==x|y
即x为1的位y为0
可知y有几位可以为1
详见代码
#include<cstdio> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<map> using namespace std; const int N=50005; int n,k; int seg[66],v[66]; long long m[66]; int main() { int i,j,r; m[0]=1; for(i=1;i<=64;i++) m[i]=m[i-1]*2; int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); long long ans=0; k; int cnt=0; memset(v,0,sizeof(v)); for(i=1;i<=63;i++) { seg[i]=n%2; n/=2; if(seg[i]==0) v[i]=++cnt; } for(i=63;i>=1;i--) { if(v[i]==0) continue; if(k>=m[v[i]-1]) ans+=m[i-1],k-=m[v[i]-1]; } cout<<ans<<endl; } return 0; }