codeforces#1829H.Don't Blame Me(dp)

Wint_x19 / 2023-05-24 / 原文

题解
#include<bits/stdc++.h>
#define io ios::sync_with_stdio(false);
#define off cin.tie(0), cout.tie(0);
#define all(x) x.begin(),x.end()
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long

using namespace std;

const int mod = 1e9 + 7;
const double eps = 1e-7;

int t = 1, n, m, x, k;

int dp[200020][70], a[200010];

int count(int num) {
    int cnt = 0;
    while (num) {
        if (num & 1) cnt++;
        num >>= 1;
    }
    return cnt;
}

void run() {
    cin >> n >> k;
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= 63; j++) {
            dp[i][j] = 0;
        }
    }
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        dp[i][a[i]] = (dp[i][a[i]] + 1) % mod;        // 只取第i个值
        for (int j = 0; j <= 63; j++) {
            dp[i][j] = (dp[i][j] + dp[i - 1][j]) % mod;   // 不取第i个值
            dp[i][j & a[i]] = (dp[i][j & a[i]] + dp[i - 1][j]) % mod;    // 取第i个值
        }
    }
    int ans = 0;
    for (int i = 0; i <= 63; i++) {
        if (count(i) == k) {
            ans = (ans + dp[n][i]) % mod;
        }
    }
    cout << ans << '\n';
}

signed main () {
    io off
    cin >> t;
    while (t--) {
        run();
    }
}