Cod sursa(job #961042)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 16:31:04
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <string.h>
 
#define mod 30103
#define Nmax 256
#define Kmax 128
 
int n, a, b, K, v[Nmax];
int c[Nmax][Kmax][16], d[Nmax][Kmax];
char viz[Nmax][Kmax];
 
void readdata()
{
    freopen("diviz.in", "r", stdin);
    freopen("diviz.out", "w", stdout);
     
    char s[Nmax];
    int i;
     
    scanf("%d %d %d", &K, &a, &b);
    scanf("%s", &s);
    n = strlen(s);
    for (i = 1; i <= n; ++i)
        v[i] = s[i-1]-'0';
}
 
void solve()
{
    int i, j, k, l, k2, val, rez = 0;
     
    c[0][0][0] = 1;
     
    for (i = 1; i <= n; ++i)
    {
        for (j = b; j >= 0; --j)
        for (k = 0; k < K; ++k)
        {
            d[j][k] = 0;
            viz[j][k] = 0;
        }
        for (j = b-1; j >= 0; --j)
        for (k = 0; k < K; ++k)
        {
            if (v[i] == 0 && j == 0) continue;
            val = 0;
            for (l = 0; l < 10; ++l)
                val += c[j][k][l];
            k2 = (k*10+v[i]) % K;
             
            d[j+1][k2] += val;
            d[j+1][k2] %= mod;
            viz[j+1][k2] = 1;
        }
        for (j = b; j >= 0; --j)
        for (k = 0; k < K; ++k)
            if (viz[j][k])
                c[j][k][v[i]] = d[j][k];
    }
 
    for (j = a; j <= b; ++j)
    for (l = 0; l < 10; ++l)
        rez += c[j][0][l];
    rez %= mod;
    printf("%d\n", rez);
}
 
int main()
{
    readdata();
    solve();
    return 0;
}