Pagini recente » Cod sursa (job #897436) | Cod sursa (job #1213656) | Cod sursa (job #1725883) | Cod sursa (job #2184042) | Cod sursa (job #1806115)
#include <iostream>
#include <fstream>
#include <queue>
#include <string.h>
using namespace std;
char nr[262145]={0}, cifre[262145]={0};
long long int d[262145][21]={0};
bool folosit[262145]={false};
bool folosit2[262145]={false};
queue<int> q;
int main(){
int i, j, p, t, lg, i2, c, h;
ifstream f("ratphu.in");
ofstream g("ratphu.out");
f>>nr>>p;
lg = strlen(nr);
for(i=0; i<lg; i++){
i2 = 1<<i;
cifre[i2] = nr[i] - '0';
d[i2][cifre[i2]%p] = 1;
for(j=0; j<lg; j++){
if(j!=i && !folosit[i2|(1<<j)]){
folosit[i2|(1<<j)] = true;
q.push(i2|(1<<j));
}
}
}
//memset(folosit, false, sizeof(folosit));
while(!q.empty()){
h = q.front();
q.pop();
t = h;
if(!folosit2[h]){
folosit2[h] = true;
//cout << h <<" ";
while(t){
c = t&(-t);
if(h&c){
for(j=0; j<p; j++)
d[h][(j*10 + cifre[c])%p]+=d[h^c][j];
}
t &= (t-1);
}
//cout << h<< "\n";
for(i=0; i<lg; i++){
i2 = 1<<i;
if(!folosit[h|i2]){
folosit[h|i2] = true;
q.push(h|i2);
}
}
}
}
/*for(i=0; i<1<<lg; i++){
for(j=0; j<p; j++)
cout<<d[i][j]<<" ";
cout<<"\n";
}*/
g<<d[(1<<lg)-1][0]<<"\n";
}