Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cstring>
- #include <ctime>
- #include <cmath>
- #include <cctype>
- #include <vector>
- #include <string>
- #include <queue>
- #include <stack>
- #include <set>
- #include <map>
- #include <iterator>
- #include <functional>
- #include <cassert>
- #include <algorithm>
- typedef long long LL;
- typedef long double LD;
- using namespace std;
- const int P = 1000000007;
- const int M = 1 << 16;
- const int L = 6251;
- const int F_MAX = 110000;
- int pc[M];
- short a[16][L];
- short cur[L];
- short init[L];
- int f[F_MAX];
- int modpow(int a, int b)
- {
- int ret = 1;
- while (b != 0)
- {
- if (b & 1)
- ret = ((LL)ret * a) % P;
- a = (LL)a * a % P;
- b >>= 1;
- }
- return ret;
- }
- int c(int n, int k)
- {
- if (k < 0 || k > n) return 0;
- int ret = f[n];
- ret = (LL)ret * modpow(f[n - k], P - 2) % P;
- ret = (LL)ret * modpow(f[k], P - 2) % P;
- return ret;
- }
- int main()
- {
- freopen("h.in", "r", stdin);
- freopen("h.out", "w", stdout);
- for (int i = 1; i < M; ++i)
- pc[i] = pc[i >> 1] + (i & 1);
- f[0] = 1;
- for (int i = 1; i < F_MAX; ++i)
- f[i] = (LL)f[i - 1] * i % P;
- int n, m, l, k;
- scanf("%d %d %d %d\n", &n, &m ,&l, &k);
- int len = 0;
- for (int i = 0, ndx = 0, pos = 0; i < n; ++i)
- {
- for (int j = 0; j < m; ++j)
- {
- char c = getchar();
- if (c == '1')
- {
- a[j][ndx] |= (1 << pos);
- }
- }
- getchar();
- init[ndx] |= (1 << pos);
- len = ndx + 1;
- pos++;
- if (pos == 16) pos = 0, ++ndx;
- }
- int ans = 0;
- for (int i = 0; i < (1 << m); ++i)
- if (pc[i] == k)
- {
- memcpy(cur, init, sizeof(cur));
- for (int j = 0; j < m; ++j)
- if (i & (1 << j))
- {
- for (int k = 0; k < len; ++k)
- cur[k] &= a[j][k];
- }
- int g = 0;
- for (int k = 0; k < len; ++k)
- g += pc[cur[k]];
- ans += c(g, l);
- if (ans >= P) ans -= P;
- }
- printf("%d\n", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement