解题思路:贪心,位运算
1:条件:i<j&&(ai&aj>=ai ^ aj),方法:遍历j,找前面满足(ai&aj>=ai ^ aj)的数的个数。
2:对于条件ai&aj>=ai^aj,找规律发现只有当数字转化为二进制时最高位1位置相同才能使得条件成立。如:
2(010),6(110),(2&6=2)<(2^6=4)
5(101),6(110),(5&6=4)=(5^6=4)
3:求数x二进制最高位的巧妙方法:log2(x)
ac代码
#include<iostream>
#include<vector>
using namespace std;
int t, n, num;
int main()
{
cin >> t;
while (t--) {
long long ans = 0;
vector<long long> cnt(33);//数据都为32位整数,数组开33位即可记录每一个整数二进制位
cin >> n;
while (n--) {
cin >> num;
int maxn = log2(num);//得到num二进制最高位1的位置
ans += cnt[maxn]++;
}
cout << ans << endl;
}
return 0;
}