Cod sursa(job #1508534)

Utilizator BLz0rDospra Cristian BLz0r Data 22 octombrie 2015 18:11:53
Problema Ratphu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
using namespace std;

#define Cmax 20

FILE *f = fopen ( "ratphu.in", "r" );
FILE *g = fopen ( "ratphu.out", "w" );

/*
Cif[i] = a i-a cifra a lui N ( index de la 0 )
D[Mask][j] = numarul de moduri de a obtine restul j cu un nr format cu cifre din Mask
*/

int Cif[Cmax];
long long D[1<<18][Cmax];

int main(){

    long long N;
    int NrC, P;

    fscanf ( f, "%lld%d", &N, &P );

    //scot cifrele lui N
    for ( NrC = 0; N; ++NrC, N /= 10 )
        Cif[NrC] = N % 10;

    int MaxConf = ( 1 << NrC ); //configuratia maxima

    D[0][0] = 1;

    for ( int conf = 0; conf < MaxConf; ++conf ){ // pentru fiecare configuratie
        for ( int i = 0; i < NrC; ++i ){ //incerc sa adaug a i-a cifra
            if ( !( conf & (1<<i) ) ){ //daca nu am mai folosit-o pana acum
                for ( int j = 0; j < P; ++j ){ //vad ce resturi pot obtine cu ea
                    D[conf|(1<<i)][( j*10 + Cif[i] ) % P] += D[conf][j];
                }
            }
        }
    }

    //afisare
    fprintf ( g, "%lld", D[MaxConf-1][0] );

    return 0;
}