Pagini recente » Cod sursa (job #2710509) | Cod sursa (job #788988) | Cod sursa (job #2653562) | Cod sursa (job #2091651) | Cod sursa (job #346221)
Cod sursa(job #346221)
#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");
}