Codeforces Round #383 (Div. 2)B.Arpa’s obvious problem and Mehrdad’s terrible solutio【思维】

来源:互联网 发布:网络销售怎么样的 编辑:程序博客网 时间:2024/06/15 19:20

B. Arpa’s obvious problem and Mehrdad’s terrible solution
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

There are some beautiful girls in Arpa’s land as mentioned before.

Once Arpa came up with an obvious problem:

Given an array and a number x, count the number of pairs of indicesi, j (1 ≤ i < j ≤ n) such that, where is bitwisexor operation (see notes for explanation).

Immediately, Mehrdad discovered a terrible solution that nobody trusted. Now Arpa needs your help to implement the solution to that problem.

Input

First line contains two integers n and x (1 ≤ n ≤ 105, 0 ≤ x ≤ 105) — the number of elements in the array and the integerx.

Second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 105) — the elements of the array.

Output

Print a single integer: the answer to the problem.

Examples
Input
2 31 2
Output
1
Input
6 15 1 2 3 4 1
Output
2
Note

In the first sample there is only one pair of i = 1 andj = 2. so the answer is1.

In the second sample the only two pairs are i = 3,j = 4 (since ) andi = 1, j = 5 (since).

A bitwise xor takes two bit integers of equal length and performs the logicalxor operation on each pair of corresponding bits. The result in each position is1 if only the first bit is 1 or only the second bit is1, but will be 0 if both are0 or both are 1. You can read more about bitwisexor operation here: https://en.wikipedia.org/wiki/Bitwise_operation#XOR.


题目大意:

给你N个数,让你找一共有多少数对,使其亦或值为x。


思路:


1、A^B=X-------------->A=X^B.


2、特别判定X==0的时候可能会出错。


Ac代码:


#include<stdio.h>#include<string.h>using namespace std;#define ll __int64ll vis[560000];ll a[560000];int main(){    ll n,x;    while(~scanf("%I64d%I64d",&n,&x))    {        memset(vis,0,sizeof(vis));        for(int i=1;i<=n;i++)        {            scanf("%I64d",&a[i]);            vis[a[i]]++;        }        if(x==0)        {            ll output=0;            for(int i=1;i<=550000;i++)            {                vis[i]--;                output+=(1+vis[i])*vis[i]/2;            }            printf("%I64d\n",output);            continue;        }        else        {            ll output=0;            for(int i=1;i<=n;i++)            {                if((x^a[i])>100020)continue;                output+=vis[x^a[i]];            }            printf("%I64d\n",output/2);        }    }}







0 0
原创粉丝点击