// Original C++ solution (slower):
#include<bits/stdc++.h>

using namespace std;



const long long K = 18, N = 55;



vector<long long> vv[1<<K];



long long C[N][N];



void pre() {

    for (long long i=0; i<N; i++) C[i][0] = 1;

    for (long long i=1; i<N; i++)

        for (long long j=1; j<N; j++)

            C[i][j] = C[i-1][j-1] + C[i-1][j];



    for (long long i=0; i<N; i++)

        for (long long j=1; j<N; j++)

            C[i][j] += C[i][j-1];

}



int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    pre();





    long long n, k, S, T;

    cin>>n>>k>>S>>T;



    if ( (S&T) != S) {

        cout<<0<<endl;

        return 0;

    }



    for (long long i=0; i<n; i++) {

        long long x;

        cin>>x;



        if ((x&S) != S) continue;

        if ((x&T) != x) continue;



        for (long long mask = 0; mask < (1<<K); mask++) {

            if ((mask&S) != S) continue;

            if ((mask&T) != mask) continue;

            long long ans = 0;

            for (long long i=0; i<K; i++) {

                bool si = S & (1<<i);

                bool ti = T & (1<<i);

                if (si == ti)   continue;

                if ((mask & (1<<i)) == 0)       ans |= x&(1<<i);

            }

            vv[mask].push_back(ans);

        }

    }



    long long ans = 0;

    for (long long mask = 0; mask < (1<<K); mask++) {

        if ((mask&S) != S) continue;

        if ((mask&T) != mask) continue;

        sort(vv[mask].begin(), vv[mask].end());



        long long ww = 0;

        while (vv[mask].size()) {

            long long last = vv[mask].back();

            long long cnt = 0;

            while (vv[mask].size() && vv[mask].back() == last)  cnt++, vv[mask].pop_back();



            ww += C[cnt][k]-1;

        }



        long long bc = __builtin_popcount(mask);

        if (bc%2)   ans += ww;

        else        ans -= ww;

    }

    cout<<abs(ans)<<endl;

}


// Optimized solution to the same problem (faster):
#include<bits/stdc++.h>

using namespace std;



const int K = 18, N = 55;

long long C[N][N];

int cnt[1<<K];



void pre() {

    for (int i=0; i<N; i++) C[i][0] = 1;

    for (int i=1; i<N; i++)

        for (int j=1; j<N; j++)

            C[i][j] = C[i-1][j-1] + C[i-1][j];



    for (int i=0; i<N; i++)

        for (int j=1; j<N; j++)

            C[i][j] += C[i][j-1];

}



int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    pre();



    int n, k, S, T;

    cin>>n>>k>>S>>T;



    vector<int> v(n);

    for (int i=0; i<n; i++) cin>>v[i];



    long long ans = 0;

    for (int mask = 0; mask < (1<<K); mask++) {

        if ((S&mask) != S || (T&mask) != mask)  continue;



        vector<int> vv;

        for (int i=0; i<n; i++) {

            if ((S&v[i]) != S || (T&v[i]) != v[i])  continue;

            int z = v[i] & (~mask);

            cnt[z]++;

            vv.push_back(z);

        }



        long long ww = 0;

        for (int x: vv){

            ww += C[cnt[x]][k]-1;

            cnt[x] = 0;

        }



        int bc = __builtin_popcount(mask);

        if (bc%2)   ans += ww;

        else        ans -= ww;

    }

    cout<<abs(ans)<<endl;

}


// Fastest known solution for this problem: