Pagini recente » Cod sursa (job #970977) | Istoria paginii runda/pre004/clasament | Cod sursa (job #1623521) | Cod sursa (job #2787490) | Cod sursa (job #783000)
Cod sursa(job #783000)
#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;
}