// Slower C++ solution:
#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;

}


// Faster C++ solution for the same problem (measured speedup: 6.057614859610633x):
#include<bits/stdc++.h>

using namespace std;



const int K = 18, N = 55;

long long C[N][N];



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];

}



bool between(int sub, int super, int x) {

    return (sub&x) == sub && (super&x) == x;

}



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 (!between(S, T, mask))  continue;



        vector<int> vv;

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

            if (between(S, T, v[i]))

                vv.push_back(v[i] & (~mask));



        sort(vv.begin(), vv.end());



        long long ww = 0;

        while (vv.size()) {

            int last = vv.back();

            int cnt = 0;

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

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

        }



        int bc = __builtin_popcount(mask);

        if (bc%2)   ans += ww;

        else        ans -= ww;

    }

    cout<<abs(ans)<<endl;

}