Cod sursa(job #783000)

Utilizator vendettaSalajan Razvan vendetta Data 1 septembrie 2012 22:51:54
Problema Ratphu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

#define nmax 18
#define Pmax 21
#define ll long long

ifstream f("ratphu.in");
ofstream g("ratphu.out");

ll n;
int P;
ll dp[1<<nmax +1][Pmax];
short int v[nmax], cpy[nmax];


void citeste(){

   f >> n >> P;


}

void afla_cifre(){

   while (n){
      cpy[++cpy[0]] = n % 10;//copie pentru a inversa sirul
      n = n / 10;
   }

   for(int i=1, j=cpy[0]; i<=cpy[0]; i++, j--){
      v[i] = cpy[j];
      //cout << v[i];
   }

   v[0] = cpy[0];

}

void rezolva(){

   //dp[conf][j] = nr de permutari a elementelor de pe pozitiile de unu din reprezentarea binara a lui conf si avand restul j
   //dp[new_conf][(j+a[k]*10) % P] += dp[i][j]; pentru fiecare bit de 0 din reprezentarea binara a lui conf pun un 1

   //initial pun fiecare element => dp[1<<(poz-1)[ a[poz] % P] = 1;

   afla_cifre();

   for(int i=1; i<=v[0]; i++) dp[ 1<<(i-1) ][ v[i]%P ] = 1;

   for(int i=0; i<(1<<v[0]); i++){//iau fiecare conf intre 0 si 1<<(v[0]-1)
         for(int j=0; j<v[0]; j++){//iau fiecare bit
            if ( (i&(1<<j)) == 0 ){//daca bit de 0 pe pozitia j
               for(int rest=0; rest<P; rest++)//iau fiecare rest
                  dp[ (i|( 1<<j )) ][ (rest*10+v[j+1])%P ] += dp[i][rest];
            }
         }

   }

   //raspunsul va fi in dp[1<<(v[0]-1)][0];

   g << dp[ (1<<v[0])-1 ][0] << "\n";

}


int main(){

   citeste();
   rezolva();

   f.close();
   g.close();

   return 0;

}