Pagini recente » Cod sursa (job #1328220) | Monitorul de evaluare | Cod sursa (job #2148793) | Cod sursa (job #2516907) | Cod sursa (job #606602)
Cod sursa(job #606602)
#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;
}