Cod sursa(job #1774753)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 9 octombrie 2016 13:42:26
Problema Diviz Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 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, Cif[12], a[Nmax], cf[Nmax][12], xr, d[2][Nmax][Nmax>>1], l, r, c, ans=0;

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];
    }

    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<=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]][(r*10+c)%K] += d[xr][i][r];
            mod(d[xr^1][cf[i+1][c]][(r*10+c)%K]);
        }


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

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

    return 0;
}