Mai intai trebuie sa te autentifici.

Cod sursa(job #516261)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 23 decembrie 2010 15:48:44
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<cstdio>
#include<cstring>
#define MOD 30103
int n,K,A,B,next[1<<8][10],d[2][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 reset(int a[1<<7])
{
    for(int i=0;i<K;i++)
        a[i]=0;
}
void solve()
{
    int rez=0;
    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++)
    {
        if(l>=A)
        {
            for(int p=0;p<=n;p++)
            {
                rez+=d[l&1][p][0];
                if(rez>=MOD)
                    rez-=MOD;
            }
        }
        for(int p=0;p<=n;p++)
            reset(d[(l+1)&1][p]);
        for(int p=0;p<=n;p++)
            for(int r=0;r<K;r++)
                if(d[l&1][p][r])
                    for(int c=0;c<=9;c++)
                        if(next[p+1][c]!=n+1)
                        {
                            d[(l+1)&1][next[p+1][c]][(r*10+c)%K]+=d[l&1][p][r];
                            if(d[(l+1)&1][next[p+1][c]][(r*10+c)%K]>=MOD)
                                d[(l+1)&1][next[p+1][c]][(r*10+c)%K]-=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();
    return 0;
}