#include <iostream>

using namespace std;

#define N 781

int solucion[N], factor[N], frontera, numeros[10];

int sumar(int hasta) {
    for (int i = N-1; i >= hasta; i--) {
        solucion[i-1] += solucion[i] / 10;
        solucion[i] %= 10;
    }
    return (solucion[hasta-1] == 0) ? hasta : hasta-1; // pos donde empieza resultado
}

void multiplicar(int n) {
    int a, corrimiento = -1;

    for (int i = frontera; i < N; i++) {
        factor[i] = solucion[i];
        solucion[i] = 0;
    }

    while (n > 0) {
        a = n % 10;     // tomo digito por digito
        corrimiento++;

        if (a != 0) {
            for (int i = N-1; i >= frontera; i--)   // multiplico
                solucion[i-corrimiento] += factor[i] * a;
        }

        n /= 10;        // sig digito
    }

    frontera = sumar(frontera-corrimiento);
}

void factorial(int n) {
    for (int i = 2; i <= n; i++)
        multiplicar(i);     // multiplica a solucion por i
}

int main() {
    int n;
    while (cin >> n && n != 0) {

        // inicializo variables globales
        for (int i = 0; i < N; i++)
            solucion[i] = 0;
        for (int i = 0; i < 10; i++)
            numeros[i] = 0;
        frontera = N-1;
        solucion[frontera] = 1;

        // calculos los numeros
        factorial(n);

        // imprimo
        cout << n << "! --" << endl;
        for (int i = frontera; i < N; i++)
            numeros[solucion[i]]++;
        for (int i = 0; i < 5; i++)
            printf("   (%d)  %3d ", i, numeros[i]);
        cout << endl;
        for (int i = 5; i < 10; i++)
            printf("   (%d)  %3d ", i, numeros[i]);
        cout << endl;

    }
    return 0;
}

