Cod sursa(job #888971)

Utilizator informatician28Andrei Dinu informatician28 Data 24 februarie 2013 12:28:08
Problema Diviz Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>

using namespace std;

ifstream in ("diviz.in");
ofstream out ("diviz.out");

#define n 201
#define k 101
#define MOD 30103

int K, A, B, N, dp[n][n][k], first[10][n], Sol;
string numar;

int main()
{
    int i, j, last, cif, r;

    in >> K >> A >> B;
    in >> numar;
    N = numar.length();
    for (i = N - 1; i >= 0; i--) numar[i + 1] = numar[i];
    for (cif = 0; cif <= 9; cif++)
    {
        last = 0;
        for (i = N; i >= 1; i--)
        {
            if ( (numar[i] - '0' ) == cif)
            {
                last = i;
                first[cif][i - 1] = last;
            }
            else first[cif][i - 1] = last;
        }
    }
    for (i = 1; i <= 9; i++)
    {
        if (first[i][0]) dp[1][ first[i][0] ][i % K] = 1;
    }
    for (j = 1; j <= N; j++)
    {
        for (i = j; i <= N; i++)
        {
            for (r = 0; r < K; r++)
            {
                for (cif = 0; cif <= 9; cif++)
                {
                    if (first[cif][i])
                    {
                        dp[j + 1][first[cif][i]][(r*10+cif)%K] += dp[j][i][r];
                        while (dp[j + 1][first[cif][i]][(r*10+cif)%K] >= MOD) dp[j + 1][first[cif][i]][(r*10+cif)%K] -= MOD;
                    }

                }
            }
        }
    }
    for (j = A; j <= B; j++)
    {
        for (i = j; i <= N; i++)
        {
            Sol += dp[j][i][0];
            if (Sol >= MOD) Sol -= MOD;
        }
    }
    out << Sol;
    return 0;
}