Problem:
Score : 800 points

Problem Statement

Given are N pairwise distinct non-negative integers A_1,A_2,\ldots,A_N.
Find the number of ways to choose a set of between 1 and K numbers (inclusive) from the given numbers so that the following two conditions are satisfied:

The bitwise AND of the chosen numbers is S.

The bitwise OR of the chosen numbers is T.

Constraints

1 \leq N \leq 50

1 \leq K \leq N

0 \leq A_i < 2^{18}

0 \leq S < 2^{18}

0 \leq T < 2^{18}

A_i \neq A_j (1 \leq i < j \leq N)

Input

Input is given from Standard Input in the following format:

N K S T
A_1 A_2 ... A_N

Output

Print the answer.

Sample Input 1

3 3 0 3
1 2 3

Sample Output 1

2

The conditions are satisfied when we choose \{1,2\} or \{1,2,3\}.

Sample Input 2

5 3 1 7
3 4 9 1 5

Sample Output 2

2

Sample Input 3

5 4 0 15
3 4 9 1 5

Sample Output 3

3

Solution in C++ (GCC 9.2.1) (judge verdict: Time Limit Exceeded)

#include <bits/stdc++.h>
using namespace std;

int n, k, s, t, ans = 0, a[128];

void dfs(int step, int num, int A, int O) {
	if ((s & A) != s) return;
	if ((t | O) != t) return;
	if (num > k) return;
	if (step == n && num <= k && A == s && O == t) ans++;
	if (step == n) return;
	dfs(step + 1, num, A, O);
	dfs(step + 1, num + 1, A & a[step], O | a[step]);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> k >> s >> t;
	for (int i = 0; i < n; i++) cin >> a[i];
	dfs(0, 0, (1 << 20) - 1, 0);
	cout << ans << endl;
	return 0;
}