몰래 교환하기

시간 제한2초메모리 제한1024 MB

요약
카드 배열에서 두 수의 XOR과 합의 차가 K 이하일 때만 두 카드를 교환할 수 있다고 할 때, 도달 가능한 서로 다른 최종 배열의 가짓수를 구한다.
난이도

어려움10점 중 8점

유형
수학, 비트 연산, 조합론, 유니온 파인드
정답자
아직 제출이 없습니다

문제

기현이는 카드 NN장을 가지고 있으며, 각 카드에는 양의 정수가 하나씩 쓰여 있다. 기현이는 카드 NN장을 보기 좋게 탁자에 일렬로 늘어놓았다.

하지만 주원이는 카드 배열이 마음에 들지 않아, 기현이 몰래 카드 배열을 바꾸려고 한다. 주원이는 탁자에 놓인 카드들 중 두 장을 골라 교환하는 과정을 반복하여 원하는 순서로 카드를 재배열하려고 한다.

그러나 아무 카드나 골라 교환하면 기현이에게 들킬 수 있기 때문에, 기현이가 눈치채지 못하게 카드를 교환해야 한다.

기현이는 두 카드의 정수를 배타적 논리합(Bitwise XOR)한 결과와 두 카드의 정수의 합의 차이가 KK이하면 두 카드가 교환되어도 눈치채지 못한다.

다시 말해, 카드 XX에 적힌 정수를 AA, 카드 YY에 적힌 정수를 BB라고 하자. ∣(A⊕B)−(A+B)∣≤K\left\vert (A\oplus B) -(A+B) \right\vert\leq K를 만족한다면 두 카드 XX, YY를 들키지 않고 몰래 교환할 수 있다. 여기서 ⊕\oplus는 Bitwise XOR을 나타내는 연산자이고, KK는 교환 전에 미리 정해진 상수이다.

초기 카드의 배열이 주어졌을 때, 가능한 최종 배열의 가짓수를 구해보자.

입력

첫 번째 줄에 카드의 수 NN과 숫자 KK가 공백으로 구분되어 정수로 주어진다. (1≤N≤100,000;1\leq N\leq 100\\,000; 0≤K<2190\leq K<2^{19})

두 번째 줄에는 탁자에 놓인 카드에 대한 초기 배열 정보 a_1,a_2,⋯ ,a_Na\_1,a\_2,\cdots ,a\_N이 공백으로 구분되어 주어진다. (0≤a_i<218;0\leq a\_i<2^{18}; 1≤i≤N1\leq i\leq N)

출력

첫 번째 줄에 가능한 최종 배열의 가짓수를 109+710^9+7로 나눈 나머지를 출력한다.

예제2

  1. 예제 1

    입력
    5 1
    3 7 9 1 262142
    
    예상 출력
    2
    
  2. 예제 2

    입력
    4 10
    1 1 8 8
    
    예상 출력
    6