这题需要注意的是,当i和j不等的时候,可以算两对,但其实自己本身和自己也是可以算一对的(本蒟蒻被误导了),两个数字异或,这就使得当且仅当两个数字相等,才能使结果为0,显然,我们可以开一个数组cnt[N]来统计各个数字出现的次数,之后可以通过找规律的方式知道,当一个数字出现了n次,那么这个数字可以有n*n对组合,最后只用遍历每个数字加起来就行了。要注意储存答案开long long,否则n*n会爆。以下附上代码。
#include<bits/stdc++.h>
using namespace std;
long long cnt[200005];
int main()
{
long long n;long long ans=0;long long maxx=0;
cin>>n;
memset(cnt,0,sizeof(cnt));
while(n--)
{
long long k;
cin>>k;
cnt[k]++;
if(maxx<k)maxx=k;//记录最大数字
}
for(int i=0;i<=maxx;i++)
{
if(cnt[i])ans+=cnt[i]*cnt[i];
}
cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;
long long cnt[200005];
int main()
{
long long n;long long ans=0;long long maxx=0;
cin>>n;
memset(cnt,0,sizeof(cnt));
while(n--)
{
long long k;
cin>>k;
cnt[k]++;
if(maxx<k)maxx=k;//记录最大数字
}
for(int i=0;i<=maxx;i++)
{
if(cnt[i])ans+=cnt[i]*cnt[i];
}
cout<<ans<<endl;
}