Pagini recente » Cod sursa (job #388913) | Cod sursa (job #845569) | Istoria paginii utilizator/anamariapintilie | Cod sursa (job #335448) | Cod sursa (job #2256721)
#include <fstream>
using namespace std;
/// TONI BO$$ was here
/// #MLC
long long TONI_BO$$[1<<20][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[20];
int rest[220];
int main()
{
int n,p,nc,i,j,k;
ifstream in("ratphu.in");
ofstream out("ratphu.out");
in>>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=0; k<nc; 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
out<<TONI_BO$$[(1<<nc)-1][0]; /// se afiseaza nr de permutari ale cifrelor lui 'n' din care rezulta nr divizibile cu p
return 0;
}