Cod sursa(job #465662)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 25 iunie 2010 11:27:28
Problema Ratphu Scor 90
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 1.66 kb
#include<cstdio>
long long n,d,nrc,m[10001][11],f[11],a[11];
long long v[10001],rez[10001][22];
void makecif(long long n)
{
    while(n)
    {
        ++f[n%10];
        n/=10;
    }
}
void makecod()
{
    long long val=0;
    for(int i=0;i<=9;++i)
    {
        m[nrc][i]=a[i];
        val=(long long)val*100+a[i];
    }
    v[nrc]=val;
}
void back(int p)
{
    if(p==10)
    {
        ++nrc;
        makecod();
        return;
    }
    for(int i=0;i<=f[p];++i)
    {
        a[p]=i;
        back(p+1);
        a[p]=0;
    }
}
long long makeit(int x)
{
    long long p=1;
    for(int i=x+1;i<=9;++i)
        p*=100;
    return p;
}
int cautb(long long x)
{
    int i=0,pas=1<<30;
    for(i=0;pas;pas>>=1)
        if(i+pas<=nrc)
            if(v[i+pas]<=x)
                i+=pas;
    return i;
}
void makemult(int pozc,int restc)
{
    long long codc=0;
    int pozf;
    for(int i=0;i<=9;i++)
        if(m[pozc][i]<f[i])
        {
            codc=0;
            for(int j=0;j<=9;j++)
                if(j!=i)
                    codc=codc*100+m[pozc][j];
                    else
                        codc=codc*100+m[pozc][j]+1;
            pozf=cautb(codc);
            for(int j=m[pozc][i]+1;j<=f[i];j++)
                rez[pozf][(restc*10+i)%d]+=rez[pozc][restc];
        }
}
int main()
{
    freopen("ratphu.in","r",stdin);
    freopen("ratphu.out","w",stdout);
    scanf("%lld%lld",&n,&d);
    makecif(n);
    back(0);
    rez[1][0]=1;
    for(int i=1;i<=nrc;i++)
        for(int j=0;j<=d;j++)
            if(rez[i][j])
                makemult(i,j);
    printf("%lld",rez[nrc][0]);
    return 0;
}