Cod sursa(job #28833)

Utilizator ionescu_bogdanIonescu Bogdan-Gabriel ionescu_bogdan Data 8 martie 2007 13:02:12
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define nmax 256
#define kmax 128
#define cmax 10
#define MOD 30103

int k,n,a,b,first[cmax][nmax],i,j,l,nr[2][nmax][kmax],cc,ll,sol;
char s[nmax];

int main()
{
    freopen("diviz.in","r",stdin);
    freopen("diviz.out","w",stdout);

    scanf("%d%d%d\n%s",&k,&a,&b,s);
    n=strlen(s);
    for (j=0;j<10;j++)
        first[j][n]=-1;
    for (i=n-1;i>=0;i--)
        for (j=0;j<10;j++)
            if (s[i]=='0'+j)
                first[j][i]=i;
            else
                first[j][i]=first[j][i+1];
    for (j=1;j<10;j++)
        if (first[j][0]>=0)
            nr[cc][first[j][0]][j%k]=1;
    for (i=2;i<a;i++)
    {
        cc=1-cc;
        memset(nr[cc],0,sizeof(nr[cc]));
        for (j=0;j<n;j++)
            for (l=0;l<k;l++)
                if (nr[1-cc][j][l])
                    for (ll=0;ll<10;ll++)
                        if (first[ll][j+1]>0)
                            nr[cc][first[ll][j+1]][(l*10+ll)%k]=(nr[cc][first[ll][j+1]][(l*10+ll)%k]+nr[1-cc][j][l])%MOD;
    }
    for (;i<=b;i++)
    {
        cc=1-cc;
        memset(nr[cc],0,sizeof(nr[cc]));
        for (j=0;j<n;j++)
            for (l=0;l<k;l++)
                if (nr[1-cc][j][l])
                    for (ll=0;ll<10;ll++)
                        if (first[ll][j+1]>0)
                            nr[cc][first[ll][j+1]][(l*10+ll)%k]=(nr[cc][first[ll][j+1]][(l*10+ll)%k]+nr[1-cc][j][l])%MOD;
        for (j=0;j<n;j++)
            sol+=nr[cc][j][0],sol%=MOD;
    }

    printf("%d\n",sol);

    return 0;
}