Pagini recente » Borderou de evaluare (job #928305) | Cod sursa (job #2050669) | Cod sursa (job #1447887) | Cod sursa (job #259653) | Cod sursa (job #2657416)
#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;
}