Cod sursa(job #484373)

Utilizator DraStiKDragos Oprica DraStiK Data 13 septembrie 2010 22:56:49
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <algorithm>
using namespace std;

#define MOD 30103
#define MAX 205
#define DIM 105
#define CIF 10

int bst[2][MAX][DIM];
int nxt[CIF][MAX];
int n,k,a,b,sol;
char buff[MAX];
int v[MAX];

void read ()
{
    int i,j;

    scanf ("%d%d%d\n",&k,&a,&b);
    fgets (buff+1,MAX,stdin);
    n=strlen (buff+1)-1;
    for (i=1; i<=n; ++i)
    {
        v[i]=buff[i]-'0';
        for (j=i; j>=0; --j)
        {
            if (nxt[v[i]][j])
                break ;
            nxt[v[i]][j]=i;
        }
    }
}

void solve ()
{
    int i,j,l,m;

    for (i=1; i<10; ++i)
        bst[0][nxt[i][0]][i%k]=1;

    for (i=1; i<=b; ++i)
    {
        for (j=1; j<=n; ++j)
        {
            if (i>=a)
                sol=(sol+bst[0][j][0])%MOD;
            for (l=0; l<k; ++l)
                if (bst[0][j][l])
                    for (m=0; m<10; ++m)
                        if (nxt[m][0])
                            bst[1][nxt[m][j+1]][(m+l*10)%k]=(bst[1][nxt[m][j+1]][(m+l*10)%k]+bst[0][j][l])%MOD;
        }
        memcpy (bst[0],bst[1],sizeof (bst[1]));
        memset (bst[1],0,sizeof (bst[1]));
    }
    printf ("%d",sol);
}

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

    read ();
    solve ();

    return 0;
}