๋ญ๊ฐ ๋ฐ์์ด ์ ์๋ ์ค๋ฅธ๋ค ์ถ์ผ๋ฉด DP์ธ๋ฏ. ์ํ ๋๋๊ณ ๋ฐ์์ ๋ณด๋ ์ฝํฌ DP ๋ํ์ ํ(?) ์ทจ๊ธ์ด๋ค. ์ต์ํด์ง ํ์๊ฐ ์๋๋ฏ. 10^9 + 7
๋ฐ์์ ๊ฐ์ ์๋ก ๋๋๋ ๊ฒ๋ DP ์ ํธ ์ค ํ๋. DP๋ ๊พธ์คํ ์ฐ์ต๋ง์ด ์ด ๊ธธ.
๋ฌธ์ ๋ ์์๋ผ๋ฆฌ AND
operation์ ํ ๋ค k๊ฐ์ ๋นํธ๊ฐ ์ผ์ ธ์๋ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ๋ ๊ฒ.
N * 64
๋งํผ์ DP ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ์๋์ ๊ฐ์ ์ธ case๋ฅผ ๋น ๋จ๋ฆฌ์ง ์๋๋ก ํ๋ค.
// i๋ฒ์งธ๋ฅผ ์ฑ์ฐ๋ ์ํฉ// ๊ธฐ๋ณธ๊ฐ ์ธํDP[i][A[i]] = 1;// i๋ฒ์งธ ์์๋ฅผ ์ ํํ์ง ์๋ ๊ฒฝ์ฐ๋ i-1๋ฒ์งธ์ ๊ฒฝ์ฐ์ ์์ ๊ฐ๋ค.DP[i][j] += DP[i-1][j];// i๋ฒ์งธ ์์๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ ๊ฐ์ ํ๊ฒ ๊ฐ์ด j & A[i]๋ก ๋ณ๊ฒฝ๋๋ค.DP[i][j & A[i]] += DP[i-1][j];
๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๋๋ DP[N][j]๋ฅผ ๋ณด๋, j๋ popcnt ๊ฐ K๊ฐ ๋๋ ๊ฒฝ์ฐ๋ง accept ํ๋ค.
int N, K;int A[200'001];ll DP[200'001][64];ll MOD = 1'000'000'007;void solve() {scanf("%d %d", &N, &K);_D("N: %d, K: %d\n", N, K);for(R int i = 1; i <= N; ++i) {scanf("%d", &A[i]);for(R int j = 0; j < 64; ++j) {DP[i][j] = 0;}}for(R int i = 1; i <= N; ++i) {DP[i][A[i]] += 1;for(int j = 0; j < 64; ++j) { // prev valueDP[i][j] += DP[i-1][j]; // ์๋ก์ด ๊ฐ์ ์ฐ์ง ์๋ ๊ฒฝ์ฐDP[i][j] %= MOD;int nv = j & A[i];DP[i][nv] += DP[i-1][j];DP[i][nv] %= MOD;}}ll ans = 0;for(int j = 0; j < 64; ++j) {if (cntbit(j) == K) {ans += DP[N][j];ans %= MOD;_D("DP[%d][%d] = %d\n", N, j, DP[N][j]);}}printf("%lld\n", ans);}