Cod sursa(job #516258)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 23 decembrie 2010 15:36:10
Problema Diviz Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
#include<cstring>
#define MOD 30103
int n,K,A,B,next[1<<8][10],d[1<<8][1<<8][1<<7];
void copy(int a[10],int b[10])
{
    for(int i=0;i<10;i++)
        a[i]=b[i];
}
void init()
{
    char s[1<<8];
    gets(s);
    n=strlen(s)-1;
    for(int j=0;j<10;j++)
            next[n+1][j]=n+1;
    for(int i=n;i>=0;i--)
    {
        copy(next[i],next[i+1]);
        next[i][s[i]-'0']=i;
    }
}
void solve()
{
    for(int c=1;c<=9;c++)
        if(next[0][c]!=n+1)
            d[1][next[0][c]][c%K]=1;
    for(int l=1;l<=B;l++)
        for(int p=0;p<=n;p++)
            for(int r=0;r<K;r++)
                if(d[l][p][r])
                    for(int c=0;c<=9;c++)
                        if(next[p+1][c]!=n+1)
                        {
                            d[l+1][next[p+1][c]][(r*10+c)%K]+=d[l][p][r];
                            if(d[l+1][next[p+1][c]][(r*10+c)%K]>=MOD)
                                d[l+1][next[p+1][c]][(r*10+c)%K]-=MOD;
                        }
}
void afis()
{
    int rez=0;
    for(int l=A;l<=B;l++)
        for(int p=0;p<=n;p++)
        {
            rez+=d[l][p][0];
            if(rez>=MOD)
                rez-=MOD;
        }
    printf("%d\n",rez);
}
int main()
{
    freopen("diviz.in","r",stdin);
    freopen("diviz.out","w",stdout);
    scanf("%d%d%d\n",&K,&A,&B);
    init();
    solve();
    afis();
    return 0;
}