Cod sursa(job #1357835)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 24 februarie 2015 09:45:14
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#include <bitset>
#define MOD 30103

using namespace std;

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

int k, A, B;

int v[210];

int d1[210][110], d2[210][110], last[210][110][10];

char s[210];

int main() {

    fin >> k >> A >> B;

    fin >> (s+1);

    int n = strlen(s + 1);

    for (int i = 1; i <= n; i++)
        v[i] = s[i] - '0';

    d1[0][0] = 1;
    d2[0][0] = 1;

    for (int i = 1; i <= n; i++) {

        for (int j = 1; j <= i; j++)
            for (int mod = 0; mod < k; mod++) {

                if (v[i] == 0 && j == 1)
                    continue;

                d2[j][mod] -= last[j][mod][v[i]];
                if (d2[j][mod] < 0)
                    d2[j][mod] += MOD;

                last[j][mod][v[i]] = 0;
            }


        for (int j = 1; j <= i; j++) {

            if (v[i] == 0 && j == 1)
                continue;

            for (int mod = 0; mod < k; mod++){

                    d2[j][(mod * 10 + v[i]) % k] = (d2[j][(mod * 10 + v[i]) % k] + d1[j-1][mod]) % MOD;
                    last[j][(mod * 10 + v[i]) % k][v[i]] += d1[j-1][mod];
                    last[j][(mod * 10 + v[i]) % k][v[i]] %= MOD;

            }

        }

        memcpy(d1, d2, sizeof(d1));

    }

    int sol = 0;

    for (int i = A; i <= B; i++)
        sol = (sol + d1[i][0]) % MOD;

    fout << sol << "\n";

    return 0;
}