Cod sursa(job #1507264)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 21 octombrie 2015 16:11:46
Problema Ratphu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#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;
}