刚拿到这个题的时候自信满满, 但是没看数据范围,遍历的 必然超时。 考虑了好久, 然而·····
题目大意: 有 n个数 这n个数中 两个数异或之后比这两个数最大值大(用公式表示: a^b > max(a,b) )
分析: 两个数( a , b ) 假设 a < b; 那么a 的最高位一定为1 , 这样的话只要 b对应位上为0 异或之后的数一定比 b 大;
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int mark[1000], wei[1000];
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
scanf("%d", &n);
int x;
memset(mark, 0, sizeof(mark));
memset(wei, 0, sizeof(wei));
for(int i=0; i<n; i++)
{
scanf("%d", &x);
int k=1;
while(x)
{
if(x%2==0) mark[k]++;
k++;
x /= 2;
}
wei[k-1] ++;
}
int sum =0;
for(int i=0; i<32; i++)
{
sum += wei[i] * mark[ i ];
}
cout << sum << endl;
}
return 0;
}