만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

몰래 교환하기

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

요약
두 카드의 값을 AND 연산한 결과가 K/2 이하일 때만 서로 바꿀 수 있습니다. 이때 만들 수 있는 최종 배열의 개수를 10^9+7로 나눈 나머지로 구합니다.
난이도

어려움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는 비트 단위 XOR 연산자이고, KK는 교환 전에 미리 정해진 상수이다.

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

입력

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

두 번째 줄에는 탁자에 놓인 카드의 초기 배열 a1,a2,⋯ ,aNa_1, a_2, \cdots, a_N이 공백으로 구분되어 주어진다. (0≤ai<2180\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