Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <ctime>
  6. #include <cmath>
  7. #include <cctype>
  8. #include <vector>
  9. #include <string>
  10. #include <queue>
  11. #include <stack>
  12. #include <set>
  13. #include <map>
  14. #include <iterator>
  15. #include <functional>
  16. #include <cassert>
  17. #include <algorithm>
  18.  
  19. typedef long long LL;
  20. typedef long double LD;
  21. using namespace std;
  22.  
  23. const int P = 1000000007;
  24. const int M = 1 << 16;
  25. const int L = 6251;
  26. const int F_MAX = 110000;
  27.  
  28. int pc[M];
  29. short a[16][L];
  30. short cur[L];
  31. short init[L];
  32.  
  33. int f[F_MAX];
  34.  
  35. int modpow(int a, int b)
  36. {
  37. int ret = 1;
  38. while (b != 0)
  39. {
  40. if (b & 1)
  41. ret = ((LL)ret * a) % P;
  42. a = (LL)a * a % P;
  43. b >>= 1;
  44. }
  45. return ret;
  46. }
  47.  
  48. int c(int n, int k)
  49. {
  50. if (k < 0 || k > n) return 0;
  51. int ret = f[n];
  52. ret = (LL)ret * modpow(f[n - k], P - 2) % P;
  53. ret = (LL)ret * modpow(f[k], P - 2) % P;
  54. return ret;
  55. }
  56.  
  57. int main()
  58. {
  59. freopen("h.in", "r", stdin);
  60. freopen("h.out", "w", stdout);
  61.  
  62. for (int i = 1; i < M; ++i)
  63. pc[i] = pc[i >> 1] + (i & 1);
  64.  
  65. f[0] = 1;
  66. for (int i = 1; i < F_MAX; ++i)
  67. f[i] = (LL)f[i - 1] * i % P;
  68.  
  69. int n, m, l, k;
  70. scanf("%d %d %d %d\n", &n, &m ,&l, &k);
  71.  
  72. int len = 0;
  73.  
  74. for (int i = 0, ndx = 0, pos = 0; i < n; ++i)
  75. {
  76.  
  77. for (int j = 0; j < m; ++j)
  78. {
  79. char c = getchar();
  80. if (c == '1')
  81. {
  82. a[j][ndx] |= (1 << pos);
  83. }
  84. }
  85. getchar();
  86. init[ndx] |= (1 << pos);
  87. len = ndx + 1;
  88. pos++;
  89. if (pos == 16) pos = 0, ++ndx;
  90. }
  91.  
  92. int ans = 0;
  93.  
  94. for (int i = 0; i < (1 << m); ++i)
  95. if (pc[i] == k)
  96. {
  97.  
  98. memcpy(cur, init, sizeof(cur));
  99.  
  100.  
  101. for (int j = 0; j < m; ++j)
  102. if (i & (1 << j))
  103. {
  104. for (int k = 0; k < len; ++k)
  105. cur[k] &= a[j][k];
  106. }
  107. int g = 0;
  108. for (int k = 0; k < len; ++k)
  109. g += pc[cur[k]];
  110.  
  111. ans += c(g, l);
  112. if (ans >= P) ans -= P;
  113. }
  114.  
  115. printf("%d\n", ans);
  116.  
  117. return 0;
  118.  
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement