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 Rust (1.42.0) (judge verdict: Accepted)

use proconio::input;

fn main() {
    input! {
        n: usize,
        k: usize,
        s: usize,
        t: usize,
        a: [usize; n]
    };
    let b = a.iter().filter(|&v| v&s == s && v|t == t ).map(|&v| v^s).collect::<Vec<usize>>();
    let mut comb = [[0 as i64; 51]; 51];
    let mut valid = [0; 51];
    for i in 1..=50 {
        comb[i][0] = 1;
        for j in 1..i {
            comb[i][j] = comb[i-1][j-1] + comb[i-1][j];
        }
        comb[i][i] = 1;
        for j in 1..=std::cmp::min(i, k) {
            valid[i] += comb[i][j];
        }
    }
    let mut res = valid[b.len()];
    let mut cnt = [0; 1<<18];
    let mask = t^s;
    for i in 1..1<<18 {
        if i|mask != mask { continue }
        let sgn = if i.count_ones()%2 == 1 { -1 } else { 1 };
        for &v in &b { cnt[v&i] += 1; }
        for &v in &b {
            if cnt[v&i] == 0 { continue }
            res += sgn * valid[cnt[v&i]];
            cnt[v&i] = 0;
        }
    }
    println!("{}", res);
}