Cod sursa(job #236293)

Utilizator Mishu91Andrei Misarca Mishu91 Data 27 decembrie 2008 02:04:48
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <cstring>

#define MAX_N 201
#define MAX_K 101
#define MOD 30103

int K, A, B, N;
char S[MAX_N];
int V[MAX_N], Rez;
int Ant[MAX_N][MAX_K], Act[MAX_N][MAX_K];
int Next[10][MAX_N];
int Nrc, Cf[MAX_K];
char viz[MAX_K];

void citire()
{
    scanf("%d %d %d\n",&K, &A, &B);
    fgets(S, sizeof S, stdin);
    N = strlen(S) - 1;
    for(int i = 1; i <= N; ++i)
    {
        V[i] = S[i-1] - '0';
        if(viz[V[i]] == 0)
            viz[V[i]] = 1,
            Cf[++Nrc] = V[i];
        for(int j = i; j >= 0; --j)
        {
            if(Next[V[i]][j]) break;
            Next[V[i]][j] = i;
        }
    }
}

void solve()
{
    for(int i = 1; i <= Nrc; ++i)
        if(Cf[i])
            Ant[Next[Cf[i]][0]][Cf[i] % K] = 1;

    for(int k = 1; k <= B; ++k)
    {
        for(int i = 1; i <= N; ++i)
        {
            if(k >= A)
                Rez += Ant[i][0],
                Rez %= MOD;
            for(int r = 0; r < K; ++r)
                if(Ant[i][r])
                for(int j = 1; j <= Nrc; ++j)
                        Act[Next[Cf[j]][i+1]][(Cf[j] + r*10) % K] += Ant[i][r],
                        Act[Next[Cf[j]][i+1]][(Cf[j] + r*10) % K] %= MOD;
        }
        memcpy(Ant, Act, sizeof Act);
        memset(Act, 0, sizeof Act);
    }

    printf("%d\n",Rez);
}

int main()
{
    freopen("diviz.in","rt",stdin);
    freopen("diviz.out","wt",stdout);

    citire();
    solve();
}