Cod sursa(job #606602)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 5 august 2011 12:45:59
Problema Semne Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>

const int N = 2505, NRC = 100, M = 505, Baza = 1000000000;

typedef int Huge[NRC];

int n, k, cif[N];

Huge f[2][M];

void read() {
    scanf("%d%d", &n, &k);

    for (int i = 1; i <= n; ++ i)
        scanf("%d", &cif[i]);
}

void res(Huge A[M]) {
    for (int i = 0; i < M; ++ i)
        for (int j = 0; j < NRC; ++ j)
            A[i][j] = 0;
}

void adun(Huge A, Huge B) {
    int i, T = 0;

    for (i = 1; i <= A[0] || i <= B[0] || T; ++ i) {
        A[i] += B[i] + T;
        T = A[i] / Baza;
        A[i] %= Baza;
    }

    A[0] = i - 1;
}

void solve() {
    for (int i = 1; i <= n; ++ i) {
        res(f[i & 1]);

        f[i & 1][cif[i] % k][++ f[i & 1][cif[i] % k][0]] = 1;

        for (int j = 0; j < k; ++ j) {
            adun(f[i & 1][j], f[1 - (i & 1)][j]);
            adun(f[i & 1][(j * 10 + cif[i]) % k], f[1 - (i & 1)][j]);
        }
    }
}

void afis(Huge A) {
    printf("%d", A[A[0]]);

    for (int i = A[0] - 1; i >= 1; -- i)
        printf("%.9d", A[i]);
}

int main() {
    freopen("mult.in", "r", stdin);
    freopen("mult.out", "w", stdout);

    read();

    solve();

    afis(f[n & 1][0]);

    return 0;
}