#include <stdio.h>
#include <assert.h>

/** Maximalny pocet cifier v cisle. */
#define NMAX 3000

/** Funkcia do pola a vytvori reprezentaciu
 * kladneho celeho cisla z premennej x */
void vytvorCislo(int a[], int x) {
    assert(x > 0);
    for (int i = 0; i < NMAX; i++) {
        a[i] = x % 10;
        x = x / 10;
    }
    assert(x == 0);  // ak x>0, tak sme sa nezmestili do pola
}

/** Funkcia vymeni dve polozky v poli a. */
void swap(int a[], int i, int j) {
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}

/** Funkcia nacita cislo a ulozi ho do pola a.
 * Vyuziva typ char, ktory sme este nebrali, ale nemusite jej rozumiet. */
void nacitaj_cislo(int a[]) {
    /* nacitavame cifry po jednej, od najvyznamnejsich po najmenej vyznamne
       a ukladame do pola v tom istom poradi */
    int pocet_cifier = 0;
    char c;
    c = getc(stdin);
    while (c >= '0' && c <= '9') {
        a[pocet_cifier] = c - '0';
        pocet_cifier++;
        assert(pocet_cifier <= NMAX);
        c = getc(stdin);
    }
    assert(c == '\n');
    /* otocime poradie cifier v poli,
       aby sme mali na indexe 0 najmenej vyznamnu cifru */
    for (int i = 0; i < pocet_cifier - i - 1; i++) {
        swap(a, i, pocet_cifier - i - 1);
    }
    /* zvysne policka pola a vyplnime nulami */
    for (int i = pocet_cifier; i < NMAX; i++) {
        a[i] = 0;
    }
}

/** Funkcia vrati pocet cifier cisla ulozeneho v poli a. */
int pocet_cifier(int a[]) {
    for (int i = NMAX - 1; i >= 0; i--) {
        /* hladame prvu nenulovu cifru od konca */
        if (a[i] != 0) {
            return i + 1;
        }
    }
    /* ak su v poli len 0, vratime 0 */
    return 0;
}

/** Tato funkcia vypise velke cislo ulozene v poli a na vystup a ukonci riadok.
 *  Nuly pred prvou nenulovou cifrou nevypisuje. */
void vypis(int a[]) {
    /* TODO: Naprogramujte tuto funkciu.
       Odporucame pouzit funkciu pocet_cifier. */
}

/** Tato funkcia prenasobi velke cislo v poli a cislom x.
 * Vysledok zapise priamo do pola a */
void nasob(int a[], int x) {
    /* TODO: Naprogramujte tuto funkciu. */
}

/** Tato funkcia do pola a spocita n! */
void faktorial(int a[], int n) {
    /* TODO: Naprogramujte tuto funkciu.
       Odporucame pouzit funkcie vytvorCislo a nasob. */
}


/* Funkcia main je hotova, nemente ju */
int main() {
    /* Nacitame velke cislo do pola a a dve male cisla do premennych b, n. */
    int a[NMAX];
    nacitaj_cislo(a);
    int b;
    scanf("%d", &b);
    int n;
    scanf("%d", &n);

    /* Vypiseme velke cislo a jeho pocet cifier. */
    printf("a: ");
    vypis(a);
    printf("  pocet cifier: %d\n", pocet_cifier(a));

    /* Velke cislo a vynasobime cislom b a vypiseme vysledok. */
    printf("a*%d: ", b);
    nasob(a, b);
    vypis(a);
    printf("  pocet cifier: %d\n", pocet_cifier(a));

    /* Do pola f spocitame n! a vypiseme vysledok. */
    int f[NMAX];
    printf("%d!: ", n);
    faktorial(f, n);
    vypis(f);
    printf("  pocet cifier: %d\n", pocet_cifier(f));

}
