Cod sursa(job #2657416)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 10 octombrie 2020 15:22:18
Problema Copii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>
 
using namespace std;
 
const string FILENAME = "copii";
ifstream fin(FILENAME + ".in");
ofstream fout(FILENAME + ".out");

typedef long long ll;
typedef long double ld;

const int NMax = 50;

int n;
int G[NMax];

int sum = 0;
void Back(int lvl, int mx, vector < int > codes, vector < int > cnt, vector < int > kids) {
    if (lvl == n) {
        for (int i = 0; i < mx; ++i) {
            if (cnt[i] == 0) 
                return;
        }

        for (int i = 0; i < mx; ++i) {
            for (int j = 0; j < mx; ++j) {
                if (i == j) continue;

                int mask = codes[i] & kids[j];
                if (mask == 0) {
                    return;
                }
            }
        }

        sum += 1;
    } else {
        for (int team = 0; team < mx; ++team) {
            vector < int > nextCodes = codes;
            vector < int > nextCnt = cnt;
            vector < int > nextKids = kids;

            ++nextCnt[team];
            nextCodes[team] = nextCodes[team] | G[lvl];
            nextKids[team] += (1 << lvl);
            Back(lvl + 1, mx, nextCodes, nextCnt, nextKids);
        }
    }
}

int main() {
    ios::sync_with_stdio(false);

    fin >> n;

    for (int i = 0; i < n; ++i) {
        string s; fin >> s;
        for (int j = 0, pwr = 1; j < n; ++j, pwr *= 2) {
            G[i] += pwr * (s[j] - '0');
        }

    }

    int total = 0;
    for (int teams = 2, fact = 2; teams <= n; ++teams, fact *= teams) {
        sum = 0;
        vector < int > codes(teams, 0), cnt(teams, 0), kids(teams, 0);

        Back(0, teams, codes, cnt, kids);
        total += sum / teams;
    }

    fout << total;
    return 0;
}