Cod sursa(job #1090243)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 22 ianuarie 2014 15:07:39
Problema Diviz Scor 0
Compilator cpp Status done
Runda concurs_2014 Marime 1.18 kb
#include <cstdio>
#include <cstring>

#define Nmax 105
#define MOD 30103

using namespace std;

int K,A,B,N;
int DP[Nmax][Nmax][Nmax];

char s[Nmax];

void read()
{
    scanf("%d%d%d\n%s",&K,&A,&B,s+1);
    s[0] ='*';
    N = strlen(s) - 1;
}

int F(int lung ,int ends ,int rest) /// lungime,unde se termina si au rest restul
{
    if(DP[lung][ends][rest] != -1)
        return DP[lung][ends][rest];

    if(lung == 1)
    {
        DP[lung][ends][rest] = ((s[ends]-48) % K == 0 );
        return DP[lung][ends][rest];
    }
    int val = 0;
    for(int i  = lung-1; i < ends; ++i)
        val = (val + F(lung - 1 , i , ((rest - (s[ends]-48))/10 + K) % K ) ) % MOD;
    DP[lung][ends][rest] = val;
    return DP[lung][ends][rest];
}

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

    for(int i = 0;i <= 101; ++i)
        for(int j = 0 ; j <= 101; ++j)
            for(int k = 0 ; k <= 101; ++k)
                DP[i][j][k] = -1;

    read();
    int ans = 0;
    for(int i = A; i <= B; ++i)
        for(int j = i; j <= N; ++j)
            ans = (ans + F(i,j,0)) % MOD;

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

    return 0;
}