比赛时没想到,位运算的话还是要转化成二进制来寻找规律啊。。。。
题意很简单:给出一串数字,如果x和y的x^y>max(x,y)的话就是满足条件的一组,求一共有多少组。
/*对于一个数,如果我们把x的二进制表示中最高位的0变成1,0前面的都不变,那么得到的这个新值肯定比x大。即:如果x的第i位为1(i为x的最高位的1所在位置),y的第i位为0(i不是y的最高位所在位置),那么z=x^y之后,z > max(x, y)。*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
using namespace std;
const int maxn = 100000+5;
int b[maxn];//b[i]代表最高位位于l的元素的个数
int s[maxn];
int t;
int n;
void Init(int x)
{
int l=31;
while(l>=0)//从高到低查找
{
if(x & (1<<l))
{
b[l]++;
return ;
}
l--;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(b,0,sizeof(b));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
Init(s[i]);
}
int ans=0;
for(int i=0;i<n;i++)
{
int l=31;
while(l>=0)//找当前的s[i]的最高位位于何处
{
if(s[i]& (1<<l)) break;
l--;
}
while(l>=0)//从最高位向下查找满足的,如果当前位满足就ans就加上它
{
if(!(s[i]&(1<<l)))
{
ans+=b[l];
}
l--;
}
}
cout << ans <<endl;
}
return 0;
}