题目链接
题目意思,有n个数求n个数取两个数有多少个这样的组合抑或值等于k
因为 a^b=k且 a^k=b;
所以我们可以先打出跟k抑或后的结果表,然后通过查表输出答案
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
long long a[200010];
long long b[200010];
long long c[200010];
int main()
{
long long n,k;
scanf("%lld%lld",&n,&k);
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=1;i<=131072;i++)
{
a[i]=i^k;
}
int cut=0;
for(int i=0;i<n;i++)
{
int q;
scanf("%d",&q);
if(!b[q])
c[cut++]=q;
b[q]++;
}
long long ans=0;
for(int i=0;i<cut;i++)
{
ans+=b[c[i]]*b[a[c[i]]];
}
if(k==0) //0抑或后等于自己本身所以要特判一下,当然也可以结合到上面去
{
ans=0;
for(int i=0;i<cut;i++)
{
ans+=b[c[i]]*(b[c[i]]-1);
}
}
printf("%lld\n",ans/2);
}