Cod sursa(job #3336325)

Utilizator stefan_dore_Stefan Dore stefan_dore_ Data 24 ianuarie 2026 15:52:24
Problema Diviz Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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

const int LMAX = 200,
          KMAX = 100,
          MOD = 30103;
int K, A, B, N, sol, cifre[LMAX+1], firstAp[LMAX+1][10], D[LMAX+1][LMAX+1][KMAX+1];
char S[LMAX+1];


int main(){
    f >> K >> A >> B;
    f >> S;
    N = strlen(S);
    //
    for (int i=1; i<=N; i++)
        cifre[i] = S[i-1] - '0';
    //
    for (int i=0; i<N; i++)
        for (int j=i+1; j<=N; j++)
            /// Daca o cifra nu a aparut deja dupa pozitia i, o marcam ca a aparut acum
            if (!firstAp[i][cifre[j]])
                firstAp[i][cifre[j]] = j;

    /// Sirurile de lungime 1 care incep cu cifre de la 1 la 9
    for (int cifraNoua = 1; cifraNoua <= 9; cifraNoua++)
        D[1][firstAp[0][cifraNoua]][cifraNoua%K] = 1;
    //

    /// Lungimea noului sir
    for (int len = 2; len <= B; len++) {
        /// Pozitia pe care este ultimul element (minim len-1, maxim N)
        for (int lastPoz = len-1; lastPoz <= N; lastPoz++) {
            /// Resturile posibile pentru sirurile de lungime len-1 cu ultimul element pe pozitia lastPoz
            for (int rest = 0; rest < K; rest++) {
                /// Fiecare cifra care se poate adauga in continuarea sirului
                for (int cifraNoua = 0; cifraNoua <= 9; cifraNoua++) {
                    /// Daca mai exista acea cifra dupa ultimul element al sirului aflat pe pozitia lastPoz
                    if (firstAp[lastPoz][cifraNoua]) {
                        /// Sirul nou de lungime len, ultimul element pe pozitia primei aparitii a noii cifre, iar noul rest va fi restul precedent * 10 + noua cifra
                        /// Se poate forma prin adaugarea noii cifre la finalul sirului de lungime len-1, cu ultimul element pe pozitia lastPoz, cu restul rest
                        D[len][firstAp[lastPoz][cifraNoua]][(rest * 10 + cifraNoua) % K] += D[len-1][lastPoz][rest];
                        D[len][firstAp[lastPoz][cifraNoua]][(rest * 10 + cifraNoua) % K] %= MOD;
                    }
                }
            }

            /// Daca lungimea sirului este potrivita
            if (A <= len) {
                sol += D[len][lastPoz][0];
                sol %= MOD;
            }
        }
    }
    //
    g << sol;
    //
    f.close();
    g.close();
    return 0;
}