#include <bits/stdc++.h>
 
using namespace std;
 
class BigInt {
private:
    static const int BASE = 1000000000;
    static const int BASE_DIGITS = 9;
    bool is_negative;
 
    void trim() {
        while (!digits.empty() && digits.back() == 0)
            digits.pop_back();
        if (digits.empty())
            is_negative = false;
    }
 
    static BigInt abs(const BigInt& n) {
        BigInt result = n;
        result.is_negative = false;
        return result;
    }
 
public:
    std::vector<int> digits;
 
    BigInt() : is_negative(false) {}
 
    BigInt(long long value) {
        if (value < 0) {
            is_negative = true;
            value = -value;
        } else {
            is_negative = false;
        }
 
        while (value) {
            digits.push_back(value % BASE);
            value /= BASE;
        }
    }
 
    BigInt(const std::string& str) {
        is_negative = false;
        digits.clear();
        int start = 0;
 
        if (!str.empty() && str[0] == '-') {
            is_negative = true;
            start = 1;
        }
 
        for (int i = str.size() - 1; i >= start; i -= BASE_DIGITS) {
            int end = std::max(start, i - BASE_DIGITS + 1);
            int part = std::stoi(str.substr(end, i - end + 1));
            digits.push_back(part);
        }
 
        trim();
    }
 
    friend std::ostream& operator<<(std::ostream& out, const BigInt& n) {
        if (n.is_negative && !n.digits.empty())
            out << "-";
        if (n.digits.empty()) {
            out << "0";
        } else {
            out << n.digits.back();
            for (int i = n.digits.size() - 2; i >= 0; i--)
                out << std::setw(BASE_DIGITS) << std::setfill('0') << n.digits[i];
        }
        return out;
    }
 
    bool operator==(const BigInt& other) const {
        return is_negative == other.is_negative && digits == other.digits;
    }
 
    bool operator<(const BigInt& other) const {
        if (is_negative != other.is_negative)
            return is_negative;
 
        if (digits.size() != other.digits.size())
            return digits.size() < other.digits.size();
 
        for (int i = digits.size() - 1; i >= 0; i--) {
            if (digits[i] != other.digits[i])
                return digits[i] < other.digits[i];
        }
 
        return false;
    }
 
    bool operator<=(const BigInt& other) const {
        return *this < other || *this == other;
    }
 
    BigInt operator+(const BigInt& other) const {
        if (is_negative != other.is_negative) {
            return *this - (-other);
        }
 
        BigInt result;
        result.is_negative = is_negative;
 
        int carry = 0;
        for (size_t i = 0; i < std::max(digits.size(), other.digits.size()) || carry; ++i) {
            if (i == result.digits.size())
                result.digits.push_back(0);
 
            result.digits[i] = carry + (i < digits.size() ? digits[i] : 0) +
                               (i < other.digits.size() ? other.digits[i] : 0);
            carry = result.digits[i] >= BASE;
            if (carry)
                result.digits[i] -= BASE;
        }
 
        return result;
    }
 
    BigInt operator-(const BigInt& other) const {
        if (is_negative != other.is_negative) {
            return *this + (-other);
        }
 
        if (abs(*this) < abs(other)) {
            return -(other - *this);
        }
 
        BigInt result;
        result.is_negative = is_negative;
 
        int carry = 0;
        for (size_t i = 0; i < digits.size() || carry; ++i) {
            result.digits.push_back(digits[i] - carry - (i < other.digits.size() ? other.digits[i] : 0));
            carry = result.digits.back() < 0;
            if (carry)
                result.digits.back() += BASE;
        }
 
        result.trim();
        return result;
    }
 
    BigInt operator*(const BigInt& other) const {
        BigInt result;
        result.digits.resize(digits.size() + other.digits.size());
        result.is_negative = is_negative != other.is_negative;
 
        for (size_t i = 0; i < digits.size(); ++i) {
            long long carry = 0;
            for (size_t j = 0; j < other.digits.size() || carry; ++j) {
                long long current = result.digits[i + j] +
                                    1LL * digits[i] * (j < other.digits.size() ? other.digits[j] : 0) + carry;
                carry = current / BASE;
                result.digits[i + j] = current % BASE;
            }
        }
 
        result.trim();
        return result;
    }
    
    void operator /= (long long x) {
        for (int i = (int) digits.size() - 1; i >= 0; i--) {
            if (i) digits[i - 1] += (digits[i] % x) * BASE;
            digits[i] /= x;
        }
        while (!digits.empty() && digits.back() == 0)
            digits.pop_back();
    }
    
    BigInt operator / (long long x) {
        BigInt n(*this);
        n /= x;
        return n;
    }
 
    BigInt operator-() const {
        BigInt result = *this;
        result.is_negative = !result.is_negative;
        return result;
    }
    
    bool is_even() {
        return digits.empty() || digits[0] % 2 == 0;
    }
};
 
void simplify(BigInt &a, BigInt &b) {
    if (a == 0) {
        b = 1;
        return;
    }
    if (b == 0) {
        a = 1;
        return;
    }
    if (a.is_even() && b.is_even()) {
        a = a / 2;
        b = b / 2;
        simplify(a, b);
        return;
    }
    if (a.is_even()) {
        a = a / 2;
        simplify(a, b);
        a = a * 2;
        return;
    }
    if (b.is_even()) {
        b = b / 2;
        simplify(a, b);
        b = b * 2;
        return;
    }
    if (b < a) {
        simplify(b, a);
        return;
    }
    b = b - a;
    simplify(a, b);
    b = b + a;
}
 
const int N = 101;
 
BigInt f[N];
BigInt c[N][N];
BigInt t[N];
 
void precalc() {
    f[0] = 1;
 
    for (int i = 1; i < N; ++i) {
        f[i] = f[i - 1] * i;
    }
 
    for (int i = 0; i < N; ++i) {
        c[i][0] = c[i][i] = 1;
        for (int j = 1; j < i; ++j) {
            c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
        }
    }
}
 
BigInt binpow(const BigInt& x, int y) {
    if (y == 0) {
        return 1;
    }
    if (y & 1) {
        return binpow(x, y - 1) * x;
    }
    BigInt z = binpow(x, y / 2);
    return z * z;
}
 
int32_t main() {
    precalc();
 
    int n, m, k;
 
    while (cin >> n >> m >> k) {
        if (n == m && m == k && k == 0) {
            break;
        }
        if (k > min(n, m)) {
            cout << "0/1\n";
            continue;
        }
        if (m == 0) {
            cout << (k == m) << '/' << 1 << '\n';
            continue;
        }
 
        t[0] = 0;
        for (int i = 1; i <= k; ++i) {
            t[i] = binpow(i, m);
            for (int j = 0; j < i; ++j) {
                t[i] = t[i] - c[i][j] * t[j];
            }
        }
 
        BigInt p = c[n][k] * t[k];
        BigInt q = binpow(n, m);
        
        simplify(p, q);
 
        cout << p << '/' << q << '\n';
    }
}
