Pagini recente » Cod sursa (job #2463516) | Cod sursa (job #1179305) | Cod sursa (job #1768315) | Cod sursa (job #2821075) | Cod sursa (job #2627861)
#include <fstream>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
ifstream cin("ratphu.in");
ofstream cout("ratphu.out");
map<vector<ll>,vector<ll> > m;
vector<ll> cif(10,0);
ll rest[20],a,p,tot;
vector<ll> compute(vector<ll> cif,int tot)
{
vector<ll> ret(21,0),aux;
if(m.find(cif)!=m.end())
return m[cif];
if(tot<0)
{
ret[0]=1;
m[cif]=ret;
return ret;
}
for(ll i=0;i<10;++i)
if(cif[i]>0)
{
cif[i]--;
tot--;
aux=compute(cif,tot);
cif[i]++;
tot++;
ll ads=i*rest[tot];
for(ll cc=0;cc<p;++cc)
ret[(cc+ads)%p]+=cif[i]*aux[cc];
}
m[cif]=ret;
return ret;
}
int main()
{
cin>>a>>p;
vector<ll> cif(10,0);
while(a)
{
++tot;
cif[a%10]++;
a/=10;
}
rest[0]=1%p;
for(ll i=1;i<19;++i)
rest[i]=(rest[i-1]*10)%p;
--tot;
cout<<compute(cif,tot)[0];
return 0;
}