Cod sursa(job #2914710)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 20 iulie 2022 21:02:23
Problema Diviz Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>

using namespace std;

const int MAX_N = 200;
const int MAX_K = 100;
const int SIGMA = 10;
const int MOD = 30103;
int dp[2][MAX_N + 1][MAX_K + 1], urm[MAX_N + 1][SIGMA + 1];
int k, a, b;

void addSelf(int &a, int b) {
    a += b;
    if (a >= MOD) {
        a -= MOD;
    }
}

int main() {
    ifstream fin("diviz.in");
    ofstream fout("diviz.out");
    string s;
    fin >> k >> a >> b;
    fin >> s;
    int n = s.size();
    for (int i = 0; i < SIGMA; i++) {
        urm[n][i] = n;
    }
    for (int i = n - 1; i >= 0; i--) {
        for (int j = 0; j < SIGMA; j++) {
            if (s[i] - '0' == j) {
                urm[i][j] = i;
            } else {
                urm[i][j] = urm[i + 1][j];
            }
        }
    }
    for (int i = 1; i < SIGMA; i++) {
        dp[1][i % k][i % k] = 1;
    }
    int answer = 0;
    for (int len = 1; len <= b; len++) {
        for (int i = 0; i < n; i++) {
            for (int r = 0; r < k; r++) {
                if (len >= a && r == 0) {
                    addSelf(answer, dp[len & 1][i][r]);
                }
                for (int _ = 0; _ < SIGMA; _++) {
                    addSelf(dp[(len & 1) ^ 1][urm[i + 1][_]][(r * 10 + _) % k], dp[len & 1][i][r]);
                }
                dp[len & 1][i][r] = 0;
            }
        }
    }
    fout << answer;
    return 0;
}