Pagini recente » Cod sursa (job #1431635) | Cod sursa (job #1662422) | Cod sursa (job #2732186) | Cod sursa (job #1770956) | Cod sursa (job #1507264)
#include <cstdio>
#include <cctype>
const int Digmax = 18;
const int Pmax = 20;
char dig[Digmax]; // cifrele lui n
long long d[1 << Digmax][Pmax]; // d[stare][r] = in cate moduri
// putem permuta starea astfel incat
// sa obtinem restul r
int main(void) {
freopen("ratphu.in", "r", stdin);
freopen("ratphu.out", "w", stdout);
int n = 0, p;
// citire date
do {
dig[n++] = getchar();
} while (isdigit(dig[n - 1]));
n--;
scanf("%d", &p);
fclose(stdin);
// dinamica pe configuratii
for (int i = 1; i < (1 << n); i++) {
if (!(i & (i - 1))) { // daca i are un singur bit
d[i][(dig[31 - __builtin_clz(i)] - '0') % p] = 1LL;
} else {
for (int j = 0; j < n; j++) {
if ((i >> j) & 1) { // il adaugam pe j
for (int r = 0; r < p; r++) {
d[i][(r * 10 + dig[j] - '0') % p] += d[i ^ (1 << j)][r];
}
}
}
}
}
printf("%lld\n", d[(1 << n) - 1][0]);
fclose(stdout);
return 0;
}