题目链接:https://vjudge.net/contest/207454#problem/E
题意描述:给n个数a1--an,以及一个数z,求n个数中有多少对数x,y,满足x^y=z
数据范围:(1 ≤ n ≤ 105, 0 ≤ z≤ 105) ,(1 ≤ ai ≤ 105)
解题思路:第一反应双层循环,暴力查找。。。一看数据范围100000*100000,肯定TLE,然后想到了学过的关于^的一个性质,于是赶紧翻书确认,emmm想对了,性质如下:如果a^b=c,那么有a^c=b,b^c=a。所以时间复杂度降下来了,一个循环就行,直接扫一遍a[i]^z在a[1---i]中出现过几次就好了,把次数相加得结果。
代码如下:
#include<iostream>
using namespace std;
long long a[200005],n,x,b,sum;
int main()
{
cin>>n>>x;
for(int i=1;i<=n;i++)
{
cin>>b;
sum+=a[b^x];
a[b]+=1ll;
}
cout<<sum;
return 0;
}