Cod sursa(job #2256715)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 9 octombrie 2018 00:15:44
Problema Ratphu Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <cstdio>
using namespace std;
/// TONI BO$$ was here
/// #MLC
long long TONI_BO$$[1<<19][20];/// TONI_BO$$[i][j] = nr de posibilitati de a forma un nr (care contine cifrele indicate de reprezentarea binara a lui 'i' , din scrierea zecimala a lui 'n') cu restul j
/// O (p*NRCIF*2^NRCIF) -> TIMP
int cif[19];
int rest[210];
int main()
{
    int n,p,nc,i,j,k;
    freopen("ratphu.in","r",stdin);
    freopen("ratphu.out","w",stdout);
    scanf("%lld%d",&n,&p);
    nc=0;
    while(n)
    {
        cif[nc++]=n%10;
        n/=10;
    }
    for(i=0; i<210; i++)
        rest[i]=i%p;
    TONI_BO$$[0][0]=1;
    for(i=0; i<(1<<nc)-1; i++) /// testam toate reprezentarile binare ale lui 'i'
        for(j=0; j<p; j++) /// pentru fiecare reprezentare binara ( si nr obtinute prin folosirea cifrelor indicate de aceasta) testam toate resturile posibile la impartirea cu 'p'
            if(TONI_BO$$[i][j]) /// daca exista nr compuse din cifrele (din vectorul ce contine scrierea zecimala a lui 'n') indicate din reprezentarea binara a lui 'i' care sa aiba restul 'j'
                for(k=nc-1; k>=0; k--) /// incercam toate cifrele lui 'n'
                    if(!(i&(1<<k)))/// daca NU s-a folosit cifra de pe pozitia 'k' in scrierea nr curent
                        TONI_BO$$[i+(1<<k)][rest[j*10+cif[k]]] += TONI_BO$$[i][j]; /// se aduna nr de numere scrise cu cifrele indicate de reprezentarea binara a lui 'i' cu restul j ( rezultatul starii curente ) , la nr de posibilati de a obtine un nr nou cu restul aferent acestuia ( prin cifrele indicate anterior ) -> se construieste starea viitoare cu ajutorul starii curente
    /// (j*10+cif[k])%p este restul la impartirea cu 'p' a oricarui nr care contine cifrele indicate de reprezentarea binara a lui 'i' cu restul j , inmultit cu 10, la care se adauga cifra curenta
    printf("%lld",TONI_BO$$[(1<<nc)-1][0]); /// se afiseaza nr de permutari ale cifrelor lui 'n' din care rezulta nr divizibile cu p

    return 0;
}