Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<climits>
- #include <string>
- #include <cstring>
- #include <sstream>
- #include <stack>
- #include <queue>
- #include <set>
- #include <map>
- #include <vector>
- #include <deque>
- #include <cmath>
- #include <algorithm>
- #define f first
- #define s second
- #define mp make_pair
- #define pb push_back
- #define INF (1 << 25)
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef pair<int, int> pii;
- typedef pair<pii, int> piii;
- typedef pair<pii, pii> piiii;
- const int maxn = 111;
- ll nCk[maxn][maxn];
- ll MOD = 1000007LL;
- class GroupNumbers
- {
- ll nChooseK(int n, int k)
- {
- if (nCk[n][k] != -1LL) return nCk[n][k];
- if (n == k || !k) return nCk[n][k] = 1LL;
- return nCk[n][k] = (nChooseK(n - 1, k) + nChooseK(n - 1, k - 1)) % MOD;
- }
- public:
- int countGroups(vector<int> numbers)
- {
- memset(nCk, 0xFF, sizeof nCk);
- int N = 0, P = 0, Z = 0;
- for (int i = 0; i < numbers.size(); i++) {
- if (numbers[i] < 0) N++;
- if (numbers[i] > 0) P++;
- if (numbers[i] == 0) Z++;
- }
- if (!N || !P || !Z) return 0;
- ll ret = 0;
- for (int i = 0; i <= N; i++)
- for (int j = 0; j <= N - i; j++)
- for (int k = 0; k <= P; k++)
- for (int l = 0; l <= P - k; l++) {
- int nn = i, np = l;
- int pn = j, pp = k;
- if (nn % 2 == 1 && pn % 2 == 0)
- if (nn + np > 0 && pn + pp > 0)
- ret += nChooseK(N, nn) * nChooseK(N - nn, pn) % MOD * nChooseK(P, pp) % MOD * nChooseK(P - pp, np) % MOD;
- ret %= MOD;
- }
- /**
- for (int i = 1; i <= N; i += 2) {
- int nn = i;
- int nr = N - i;
- for (int j = 0; j <= nr; j += 2) {
- int pn = j;
- int zn = nr - j;
- for (int ii = 0; ii <= P; ii++) {
- int pp = ii;
- int pr = P - ii;
- for (int jj = 0; jj <= pr; jj++) {
- int np = jj;
- int zp = pr - jj;
- if (nn + np > 0 && pn + pp > 0) {
- assert(nn % 2 == 1);
- assert(pn % 2 == 0);
- cout << nn << " " << pn << " " << zn << " | " << np << " " << pp << " " << zp << endl,
- ret += nChooseK(N, nn) * nChooseK(nr, pn) * nChooseK(P, pp) * nChooseK(pr, np);
- }
- }
- }
- }
- }
- **/
- return ret;
- }
- };
- #ifdef COMPILE_MAIN
- int main()
- {
- GroupNumbers x;
- cout << x.countGroups({-1,-2,-3,1,2,3,0}) << endl;
- return 0;
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement