Pagini recente » Borderou de evaluare (job #3302461) | Cod sursa (job #3350004) | Borderou de evaluare (job #3332717) | Borderou de evaluare (job #3197225) | Cod sursa (job #3336330)
#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[2][LMAX+1][KMAX+1];
char S[LMAX+1];
void reset(int len) {
for (int lastPoz = 1; lastPoz <= N; lastPoz++)
for (int rest = 0; rest < K; rest++)
D[(len+1)%2][lastPoz][rest] = 0;
}
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%2][firstAp[lastPoz][cifraNoua]][(rest * 10 + cifraNoua) % K] += D[(len+1)%2][lastPoz][rest];
D[len%2][firstAp[lastPoz][cifraNoua]][(rest * 10 + cifraNoua) % K] %= MOD;
}
}
}
/// Daca lungimea sirului este potrivita
if (A <= len) {
sol += D[len%2][lastPoz][0];
sol %= MOD;
}
}
reset(len);
}
//
g << sol;
//
f.close();
g.close();
return 0;
}