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