Cod sursa(job #346221)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 7 septembrie 2009 11:33:08
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <cstring>

#define FIN "mult.in"
#define FOUT "mult.out"

#define N 2502
#define K 502
#define MAXCIF 100

int n, k, v[N], d[2][K][MAXCIF];
int unu[N] = {1, 1};

void add(int A[], int B[])
{
      int i, t = 0;

      for (i = 1; i <= A[0] || i <= B[0] || t; i ++, t /= 10)
              A[i] = (t += A[i] + B[i]) % 10;

      A[0] = i - 1;
}

int main()
{
    int i, j;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d%d", &n, &k);

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

    d[1][v[1] % k][0] = d[1][v[1] % k][1] = 1;

    for (i = 2; i <= n; ++ i)
        for (j = 0; j < k; ++ j)
        {
            memset(d[i & 1][j], 0, sizeof(d[i & 1][j]));

            memcpy(d[i & 1][j], d[(i - 1) & 1][j], sizeof(d[(i - 1) & 1][j]));

            add(d[i & 1][j], d[(i - 1) & 1][(j + k - v[i] % k) % k]);

            //d[i & 1][j] = d[(i - 1) & 1][(j + k - v[i] % k) % k] + d[(i - 1) & 1][j];

            if (v[i] % k == j)
                add(d[i & 1][j], unu);
        }

    for ( ; d[n & 1][0][0]; -- d[n & 1][0][0])
        printf("%d", d[n & 1][0][d[n & 1][0][0]]);

    printf("\n");

}