Pagini recente » Cod sursa (job #1798222) | Cod sursa (job #1428309) | Cod sursa (job #1671547) | Cod sursa (job #3265161) | Cod sursa (job #779181)
Cod sursa(job #779181)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 205
#define MOD 30103
ifstream f("diviz.in");
ofstream g("diviz.out");
int n, K, A, B, a[nmax], ap[11], viz[nmax][11], dp[nmax][nmax][101];
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(){
//numarul de numere care sa fie divizibile cu K si care sa ai aiba intre A si B cifre;
//metoda inainte
//dp[i][j][r] = numarul de subsiruri de lungime j iar a[i] sa fie a j-a cifra din numar si numarul format sa aiba restul r
int rez = 0;
for(int i=1; i<=n; i++){
//cout << "aici" << dp[3][3][0] << "\n";
if (a[i] != 0 && viz[1][a[i]] == 0){//initializez dinamica; cand pun doar o cifra; asta sa nu fie 0 si sa nu o mai fi pus inainte ca si prima cifra
dp[i][1][ a[i]%K ] = 1;
viz[1][ a[i] ] = 1;
//pun a 2 cifra
int rst = a[i]% K;
for(int i2=0; i2<10; i2++) ap[i2] = 0;
for(int i2=i+1; i2<=n; i2++){
if (ap[ a[i2] ] == 0){//daca nu am mai pus-o inainte la un pas i2 precedent
ap[ a[i2] ] = 1;
dp[i2][2][ (rst*10+a[i2])%K ] += (dp[i][1][rst]%MOD);
dp[i2][2][ (rst*10+a[i2])%K] %= MOD;
}
}
}
for(int j=2; j<=B; j++){
if (viz[j][ a[i] ] == 0){
for(int rest=0; rest<K; rest++){
for(int i2=0; i2<10; i2++) ap[i2] = 0;
for(int i2=i+1; i2<=n; i2++){//pun a[i2] a j+1-a cifra
if (ap[ a[i2] ] == 0){
ap[ a[i2] ] = 1;
dp[i2][j+1][(rest*10+a[i2])%K] += (dp[i][j][rest]%MOD);
dp[i2][j+1][(rest*10+a[i2])%K] %= MOD;
//if (dp[i][j][rest] > 0) viz[j][ a[i] ] = 1;
}
}
}
}
}
for(int j=A; j<=B; j++) rez += (dp[i][j][0]%MOD), rez %=MOD
;//, cout << dp[i][j][0] << " ";
//cout << "\n";
}
g << rez%MOD << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}