Pagini recente » Cod sursa (job #1916605) | Cod sursa (job #2467410) | Cod sursa (job #225345) | Cod sursa (job #746778) | Cod sursa (job #779351)
Cod sursa(job #779351)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 201
#define Kmax 101
#define MOD 30103
ifstream f("diviz.in");
ofstream g("diviz.out");
short int K, A, B, n, a[nmax], dp[nmax][nmax][Kmax], unde[nmax][11];
string s;
void citeste(){
f >> K >> A >> B;
f.get();
getline(f,s);
for(int i=0; i<s.size(); i++) a[i+1] = s[i]-'0';
n = s.size();
}
void rezolva(){
//nr de numerere cu cifre intre A si B si care sa fie divizibile cu K
//dp[i][j][r] = nr de subsiruri din primele i iar a[i] sa fi a j-a cifra din numar si acel numar sa dea restul r
//imi precalculez unde[i][cifra] = poz; prima pozitie a lui cifra din dreapta lui i
//pt ca ma intereseaza cand sunt in starea i,j,r sa ma duc in dreapta dar doar la prima cifra din fiecare 0,9 din dreapta lui i
for(int i=n; i>=1; i--)
for(int j=0; j<=9; j++){
if (a[i] == j) unde[i][j] = i;
else unde[i][j] = unde[i+1][j];
}
//initializez dinamica : initializez fiecare prima cifra (cifra = 1..9)
for(int i=1; i<10; i++) dp[ unde[1][i] ][1][i%K] = 1;//prima cifra din stanga lui 1, evident ma intereseaza prima aparitie a fiecarei cifre
int rez = 0;
for(int i=1; i<=n; i++){
for(int j=1; j<=B; j++){
for(int r=0; r<K; r++){//ma aflu in (i,j,r) ma duc in unde[i+1][cifra], j+1, (r*10+cifra)%K
dp[i][j][r] %= MOD;
for(int cifra = 0; cifra<10; cifra++){
if (unde[i+1][cifra] == 0) continue;
dp[ unde[i+1][cifra] ][j+1][(r*10+cifra)%K] += dp[i][j][r];
dp[ unde[i+1][cifra] ][j+1][(r*10+cifra)%K] %= MOD;
}
}
}
for(int j=A; j<=B; j++) rez += (dp[i][j][0] % MOD), rez %= MOD;
}
g << rez%MOD << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}