Cod sursa(job #1839974)

Utilizator antanaAntonia Boca antana Data 3 ianuarie 2017 17:24:24
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define MAXN 202
#define MAXK 101
#define MOD 30103

using namespace std;

int d[2][MAXN][MAXK], v[MAXN], pos[MAXN][10];
char s[MAXN];
bool found[10];

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

    int n, i, j, k, a, b, t, cif, ans = 0;

    scanf("%d%d%d\n", &k, &a, &b);

    gets(s+1);
    n = strlen(s+1);

    for(i=1; i<=n; ++i)
        v[i] = s[i]-'0';

    for(i=1; i<=n; ++i)
        for(j=i+1; j<=n; ++j)
            if(!pos[i][v[j]])
                pos[i][v[j]] = j;

    for(i=1; i<=n; ++i)
        if(!found[v[i]] && v[i])
        {
            found[v[i]] = 1;
            d[1][i][v[i]%k] = 1;
            if(a == 1 && v[i]%k == 0)
                ans++;
        }

    for(i=1; i<b; ++i)
    {
        memset(d[(i+1)&1], 0, sizeof(d[(i+1)&1]));

        for(j=1; j<=n; ++j)
            for(t=0; t<k; ++t)
                if(d[i&1][j][t])
                    for(cif=0; cif<10; ++cif)
                        if(pos[j][cif]){
                            d[(i+1)&1][pos[j][cif]][(t*10 + cif)%k] = (d[(i+1)&1][pos[j][cif]][(t*10 + cif)%k] + d[i&1][j][t]);
                            if(d[(i+1)&1][pos[j][cif]][(t*10 + cif)%k] >= MOD) d[(i+1)&1][pos[j][cif]][(t*10 + cif)%k] -= MOD;
                        }

        if(i>=a-1)
        {
            for(j=1; j<=n; ++j)
                ans = (ans + d[(i+1)&1][j][0]);

            ans %= MOD;
        }
    }
    /*
    for(i=1; i<=b; i++){
        for(j=1; j<=n; ++j){
            for(t=0; t<k; ++t)
                printf("%d ", d[i][j][t]);
            printf("\n");
        }

        printf("\n");
    }*/

    printf("%d", ans);

    return 0;
}