题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5518
题意:n个数,从中选出两个数,问这两个数的异或值大于两个数较大的数的组合有多少种
题目分类:异或
代码:
#include<bits/stdc++.h> using namespace std; const int MaxN = 1e5 + 10; int a[MaxN], bit[50]; // bit[i]表示有多少个数的最高位的1在第i位上 void solve(int x) { int l = 31; while(l >= 0) { if(x & (1<<l)) { bit[l]++; return ; } l--; } return ; } int main() { int T, n; scanf("%d", &T); while(T--) { scanf("%d", &n); memset(bit, 0, sizeof(bit)); for(int i = 0; i < n; i++) { scanf("%d", &a[i]); solve(a[i]); } int ans = 0; for(int i = 0; i < n; i++) { int l = 31; while(l >= 0) { if(a[i] & (1<<l)) break; l--; } while(l >= 0) { if(!(a[i] & (1<<l))) ans += bit[l]; l--; } } printf("%d ", ans); } return 0; }