Cod sursa(job #2627861)

Utilizator loraclorac lorac lorac Data 12 iunie 2020 22:35:01
Problema Ratphu Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#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;
}