Cod sursa(job #1839957)

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

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

using namespace std;

int d[MAXN][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)
    {
        for(j=1; j<=n; ++j)
            for(t=0; t<k; ++t)
                for(cif=0; cif<10; ++cif)
                    if(pos[j][cif])
                        d[i+1][pos[j][cif]][(t*10 + cif)%k] = (d[i+1][pos[j][cif]][(t*10 + cif)%k] + d[i][j][t]) % MOD;

        if(i>=a-1)
            for(j=1; j<=n; ++j)
                ans = (ans + d[i+1][j][0]) % 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;
}