Cod sursa(job #652746)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 26 decembrie 2011 02:57:44
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<cstdio>
#include<cstring>

using namespace std;
const int modulo = 30103;
const int NMAX = 200;
const int KMAX = 100;

int K, A, B, N;
char S[NMAX + 1];
int V[NMAX][2][KMAX];
int next[NMAX][10];

inline void add(int* p, int x)
{
    (*p) += x;
    (*p) = (*p) >= modulo ? (*p) - modulo : (*p);
}

int main()
{
    freopen("diviz.in", "r", stdin);
    freopen("diviz.out", "w", stdout);
    
    scanf("%d %d %d ", &K, &A, &B);
    fgets(S, (NMAX + 1) * sizeof(char), stdin);
    N = strlen(S);
    N--;
    S[N] = 0;
   
    for(int i = 0; i < N; i++)
        for(int k = 0; k < 10; k++)
            for(int j = i + 1; j < N; j++)
                if(S[j] == '0' + k)
                {
                    next[i][k] = j;
                    break;
                }
    int ok = 0;
    
    int result = 0;
    
    V[0][ok][(S[0] - '0')%K] = 1;
    
    for(int i = 1; i < 10; i++)
        if(i != S[0] - '0' && next[0][i])
        {
                V[next[0][i]][ok][i % K] = 1;
        }
    
    for(int j = 1; j <= B; j++, ok = !ok)
    {
        for(int i = 0; i < N; i++)
            for(int k = 0; k < K; k++)
                V[i][!ok][k] = 0;
        
        for(int i = 0; i < N; i++)
        {        
            for(int k = 0; k < K; k++)
                if(V[i][ok][k])
                for(int z = 0; z < 10; z++)
                    if(next[i][z])
                        add(&V[next[i][z]][!ok][(k * 10 + z) % K],V[i][ok][k]);
                if(A <= j && V[i][ok][0])
                    add(&result, V[i][ok][0]);
        }
    }
    printf("%d\n", result);
    return 0;
}