Cod sursa(job #1044641)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 30 noiembrie 2013 10:14:58
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
#define MOD 30103
#define LgMax 205
#define KMax 105

using namespace std;

int answer;
int K, A, B, n;
char aux[LgMax];
int N[LgMax];
int dp[2][LgMax][KMax];
bool uz[10];

struct stare
{
    int j, r;
    stare ()
    {
        j = r = 0;
    }
    stare (const int _j, const int _r)
    {
        j = _j;
        r = _r;
    }
};
queue <stare> Q;
/**
    dp[i][j][r] = numarul de subsiruri de lungime i, folosind din primele j, inclusiv j,
    care dau restul r la impartirea la K
    dp[i, j, r] -> dp[i+1, t, (r*10 + N[t]) % K],  t = j+1...lungime(N)
*/

void Read()
{
    ifstream f ("diviz.in");
    f>>K>>A>>B;
    f>>(aux+1);
    f.close();
}

void Init()
{
    n = strlen(aux+1);
    int i;
    for (i=1; i<=n; ++i)
    {
        N[i] = aux[i] - '0';
        if (N[i] == 0)
            continue;
        if (!uz[N[i]])
            uz[N[i]] = true;
        else
            continue;
        dp[1][i][N[i] % K] = 1;
        Q.push(stare(i, N[i]%K));
    }
    for (i=0; i<10; ++i)
        uz[i] = false;
}

void Solve()
{
    Init();
    int line, i;
    for (i = 1, line = 0; i<=B; ++i, line = 1-line)
    {
        while (!Q.empty())
        {
            stare st = Q.front();
            Q.pop();
            dp[1-line][st.j][st.r] %= MOD;
            if (A <= i && i <= B && st.r == 0)
                answer = (answer + dp[1 - line][st.j][st.r]) % MOD;
            for (int t = st.j+1; t<=n; ++t)
            {
                if (!uz[N[t]])
                    uz[N[t]] = true;
                else
                    continue;
                dp[line][t][(st.r*10 + N[t]) % K] += dp[1-line][st.j][st.r]; ///  mod
            }
            dp[1 - line][st.j][st.r] = 0;
            for (int t = 0; t<10; ++t)
                uz[t] = false;
        }
        for (int t = 1; t<=n; ++t)
            for (int r = 0; r<K; ++r)
                if (dp[line][t][r])
                    Q.push(stare(t, r));
    }
}

void Write()
{
    ofstream g("diviz.out");
    g<<answer<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}