Cod sursa(job #465741)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 25 iunie 2010 12:47:48
Problema Ratphu Scor 80
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 0.93 kb
#include<stdio.h>
#define ll long long

int p[23],v[23],r,nr;
ll d[(1<<18)][20];
char bit[(1<<18)+4];

int rest(int val)
{
    if(val<0)
        val+=r;
    return val;
}

int main ()
{
    ll val;
    int i,j,ci,poz;
    freopen("ratphu.in","r",stdin);
    freopen("ratphu.out","w",stdout);
    scanf("%lld%d",&val,&r);
    while(val)
    {
        nr++;
        v[nr]=val%10;
        val/=10;
    }
    for(i=1;i<=(1<<nr);i++)
        bit[i]=(i&1 ? bit[i/2]+1 : bit[i/2]);
    p[0]=1;
    for(i=1;i<nr;i++)
        p[i]=(p[i-1]*10)%r;
    for(i=0;i<nr;i++)
        d[(1<<i)][(p[0]*v[i+1])%r]=1;
    for(i=1;i<(1<<nr);i++)
        for(j=0;j<r;j++)
        {
            ci=i;poz=0;
            while(ci)
            {
                if((ci&1))
                    d[i][j]+=d[i-(1<<poz)][rest(j-(v[poz+1]*p[bit[i]-1])%r)];
                ci/=2;
                poz++;
            }
        }
    printf("%lld\n",d[(1<<nr)-1][0]);
    return 0;
}