(A xor C) & (B xor C) 在给定A,B的前提下,式子值最小,此时C的非0最小值是多少?
位运算还是按位考虑
a | b | c | 值 |
1 | 1 | 1 | 0 |
1 | 0 | 0/1 | 0 |
0 | 1 | 0/1 | 0 |
0 | 0 | 0 | 0 |
这是保证式子值最小下的abc关系,我们希望c最小,那么c可以取a&b。
但是注意,题目中要求,C非0,所以如果a&b为0,则不行。当a&b为0时,我们应该找,最小的a,b有一个为1的位,将c的这位0变成1。
一个是注意开long long这题正好比int大2倍,在一个是注意位运算优先级。第一次知道!= 优先级比位运算高.....
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 typedef long long ll; 5 ll a,b,res; 6 int T; 7 int main() 8 { 9 for (scanf("%d",&T);T != 0;T--) 10 { 11 scanf("%lld%lld",&a,&b); 12 if ((a & b) != 0) 13 res = a & b; 14 else 15 for (int i = 0;i <= 33;i++) 16 if ((a & ((ll)1 << i)) | (b & ((ll)1 << i))) 17 { 18 res = (ll)1 << i; 19 break; 20 } 21 printf("%lld ",res); 22 } 23 return 0; 24 }