Cod sursa(job #1774875)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 9 octombrie 2016 15:52:43
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

const int Mod = 30103;
const int Nmax = 202;

char aul[Nmax];
int K, A, B, i, j, n, xr, l, r, c, ans=0;
int Cif[12], a[Nmax], cf[Nmax][12], d[2][Nmax][Nmax>>1], rest[Nmax>>1][12];

void mod(int& x)
{
    if(x>=Mod) x-=Mod;
}

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

    scanf("%d%d%d\n", &K, &A, &B);
    gets(aul+1);
    n = strlen(aul+1);
    for(i=1; i<=n; ++i) a[i] = aul[i]-'0';

    for(i=0; i<=9; ++i) Cif[i] = -1;

    for(i=n; i; --i)
    {
        Cif[a[i]] = i;
        for(j=0; j<=9; ++j)
            cf[i][j] = Cif[j];
    }

    for(i=0; i<K; ++i)
    for(j=0; j<=9; ++j)
        rest[i][j] = (i*10+j)%K;

    xr=0;

    for(i=1; i<=9; ++i)
    if(cf[1][i]!=-1)
        d[xr][cf[1][i]][i%K] = 1;

    for(l=1; l<=B && l<=n; ++l, xr^=1)
    {
        for(i=l; i<=n; ++i)
        for(c=0; c<=9; ++c)
        if(cf[i+1][c]!=-1)
        for(r=0; r<K; ++r)
        {
            d[xr^1][cf[i+1][c]][rest[r][c]] += d[xr][i][r];
            mod(d[xr^1][cf[i+1][c]][rest[r][c]]);
        }

        for(i=l; i<=n; ++i)
        for(r=0; r<K; ++r)
        {
            if(!r && A<=l && l<=B)
                ans += d[xr][i][r];

            d[xr][i][r] = 0;
        }

        ans %= Mod;
   }

    printf("%d\n", ans);

    return 0;
}