Codeforces Round #383 (Div. 2) B(打表)

来源:互联网 发布:剑网三咩太捏脸数据 编辑:程序博客网 时间:2024/06/15 10:53

题目链接
题目意思,有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);}
0 0
原创粉丝点击