Cod sursa(job #7360)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 21 ianuarie 2007 13:31:15
Problema Diviz Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <string.h>
#define NMAX 122
#define MOD 30103
#define min(a, b) ((a) < (b) ? (a):(b))

int V[NMAX][NMAX][NMAX], N, K, A, B, C[NMAX], F[NMAX][12][NMAX], Cate[NMAX];
char s[NMAX];

int main()
{
        int i, j, r, sum = 0, t, p, n = 1;
        
        freopen("diviz.in", "r", stdin);
        scanf("%d %d %d ", &K, &A, &B);
        gets(s);
        N = strlen(s);
        for (i = 0; i < N; i++)
            C[i+1] = s[i]-48, Cate[ C[i+1] ]++;

        for (i = 1; i <= N; i++)
            if (C[i]>0) V[i][1][C[i]%K] = 1;
        
        for (i = 2; i <= N; i++)
        {
            for (j = 1; j <= min(i, B); j++)
                for (r = 0; r < K; r++)
                    {
                        V[i][j][r] = (V[i][j][r]+V[i-1][j][r])%MOD;
                        V[i][j][t = (r*10+C[i])%K] = (V[i][j][t]+V[i-1][j-1][r])%MOD;
                        F[i][ C[i] ][r]++;
                    }
        }

        sum = 0;
        for (i = A; i <= B; i++) sum = (sum+V[N][i][0])%MOD;
        for (i = 0; i <= 9; i++)
            if (F[N][i][0] > 0)
            {
             sum = sum-Cate[i]+1;
            }

        freopen("diviz.out", "w", stdout);
        printf("%d\n", sum);

        return 0;
        
}