Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. #include<climits>
  2. #include <string>
  3. #include <cstring>
  4. #include <sstream>
  5. #include <stack>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <vector>
  10. #include <deque>
  11. #include <cmath>
  12. #include <algorithm>
  13.  
  14. #define f first
  15. #define s second
  16. #define mp make_pair
  17. #define pb push_back
  18.  
  19. #define INF (1 << 25)
  20.  
  21.  
  22. using namespace std;
  23.  
  24. typedef long long ll;
  25. typedef long double ld;
  26. typedef pair<int, int> pii;
  27. typedef pair<pii, int> piii;
  28. typedef pair<pii, pii> piiii;
  29.  
  30. const int maxn = 111;
  31.  
  32. ll nCk[maxn][maxn];
  33. ll MOD = 1000007LL;
  34.  
  35. class GroupNumbers
  36. {
  37. ll nChooseK(int n, int k)
  38. {
  39. if (nCk[n][k] != -1LL) return nCk[n][k];
  40. if (n == k || !k) return nCk[n][k] = 1LL;
  41. return nCk[n][k] = (nChooseK(n - 1, k) + nChooseK(n - 1, k - 1)) % MOD;
  42. }
  43.  
  44.  
  45. public:
  46. int countGroups(vector<int> numbers)
  47. {
  48. memset(nCk, 0xFF, sizeof nCk);
  49.  
  50. int N = 0, P = 0, Z = 0;
  51. for (int i = 0; i < numbers.size(); i++) {
  52. if (numbers[i] < 0) N++;
  53. if (numbers[i] > 0) P++;
  54. if (numbers[i] == 0) Z++;
  55. }
  56.  
  57. if (!N || !P || !Z) return 0;
  58.  
  59. ll ret = 0;
  60. for (int i = 0; i <= N; i++)
  61. for (int j = 0; j <= N - i; j++)
  62. for (int k = 0; k <= P; k++)
  63. for (int l = 0; l <= P - k; l++) {
  64. int nn = i, np = l;
  65. int pn = j, pp = k;
  66.  
  67. if (nn % 2 == 1 && pn % 2 == 0)
  68. if (nn + np > 0 && pn + pp > 0)
  69. ret += nChooseK(N, nn) * nChooseK(N - nn, pn) % MOD * nChooseK(P, pp) % MOD * nChooseK(P - pp, np) % MOD;
  70. ret %= MOD;
  71. } 
  72. /**
  73. for (int i = 1; i <= N; i += 2) {
  74. int nn = i;
  75. int nr = N - i;
  76.  
  77. for (int j = 0; j <= nr; j += 2) {
  78. int pn = j;
  79. int zn = nr - j;
  80.  
  81. for (int ii = 0; ii <= P; ii++) {
  82. int pp = ii;
  83. int pr = P - ii;
  84.  
  85. for (int jj = 0; jj <= pr; jj++) {
  86. int np = jj;
  87. int zp = pr - jj;
  88.  
  89. if (nn + np > 0 && pn + pp > 0) {
  90. assert(nn % 2 == 1);
  91. assert(pn % 2 == 0);
  92. cout << nn << " " << pn << " " << zn << " | " << np << " " << pp << " " << zp << endl,
  93. ret += nChooseK(N, nn) * nChooseK(nr, pn) * nChooseK(P, pp) * nChooseK(pr, np);
  94. }
  95. }
  96. }
  97. }
  98. }
  99. **/
  100.  
  101. return ret;
  102. }
  103. };
  104.  
  105.  
  106. #ifdef COMPILE_MAIN
  107. int main()
  108. {
  109. GroupNumbers x;
  110. cout << x.countGroups({-1,-2,-3,1,2,3,0}) << endl;
  111. return 0;
  112. }
  113. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement