1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

string ile_snu(const vector<string>& czas_pracy, int n, int l) {
    for (int xl = 0; xl < l; ++xl) {
        bool jest_opieka = false;
        for (int xn = 0; xn < n; ++xn) {
            if (czas_pracy[xn][xl] == '.') {
                jest_opieka = true;
                break;
            }
        }
        if (!jest_opieka) {
            return "-1";
        }
    }

    for (const auto& element : czas_pracy) {
        if (all_of(element.begin(), element.end(), [](char c) { return c == 'X'; })) {
            return "0/1";
        }
    }

    vector<int> liczba_kropek;
    for (const auto& element : czas_pracy) {
        liczba_kropek.push_back(count(element.begin(), element.end(), '.'));
    }

    int max_kropki = *max_element(liczba_kropek.begin(), liczba_kropek.end());
    int min_kropki = *min_element(liczba_kropek.begin(), liczba_kropek.end());

    if (max_kropki == 0) {
        return "0/1";
    }

    int nwd = gcd(max_kropki, min_kropki);
    return to_string(max_kropki / nwd) + "/" + to_string(min_kropki / nwd);
}

int main() {
    int n, l;
    cin >> n >> l;

    vector<string> czas_pracy(n);
    for (int i = 0; i < n; ++i) {
        cin >> czas_pracy[i];
    }

    cout << ile_snu(czas_pracy, n, l) << endl;

    return 0;
}