传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3870
已知n个数组,求a^b>max(a,b)这样的组合有多少种
将一个数按二进制写
比如 a=110110,也就是要求满足条件的b有多少。那么只能是某个0变为1,且之前的数不变,所以b的最高位一定是a为0的那位
f[i]表示最高位为i位的数有多少个,累加即可
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int T;
int n;
int ans;
int s[100005];
int d[40];
int bit(int x)
{
for (int i=0;;i++)
{
if (x==(1<<i))
{
return i;
}
if (x<(1<<i))
{
return i-1;
}
}
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
memset(d,0,sizeof(d));
for (int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
d[bit(s[i])]++;
}
ans=0;
for (int i=1;i<=n;i++)
{
for (int j=0;j<=bit(s[i]);j++)
{
if ((s[i]&(1<<j))==0)
{
ans+=d[j];
}
}
}
printf("%d\n",ans);
}
}