Pagini recente » Cod sursa (job #2715197) | Cod sursa (job #46602) | Cod sursa (job #2387983) | Cod sursa (job #1912410) | Cod sursa (job #1397825)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("diviz.in");
ofstream out("diviz.out");
const int NMAX = 200;
const int KMAX = 100;
const int MOD = 30103;
int d[2][NMAX+2][KMAX+2];
int v[NMAX+2], fir[11][NMAX+2], last[11], N,A,B,K, Ans;
inline bool is_digit( char c ) {
return ( c > 47 && c < 59 );
}
void citire() {
in >> K >> A >> B;
char c = in.get();
while( !is_digit(c) ) in.get(c);
while( is_digit(c) ) {
v[++N] = c - 48;
in.get(c);
}
for( int i = N; i >= 1; --i ) {
last[ v[i] ] = i;
for( int j = 0; j < 10; ++j ) fir[j][i] = last[j];
}
for( int j = 0; j < 10; ++j ) fir[j][0] = last[j];
}
int main() {
citire();
d[0][0][0] = 1;
for( int cf = 0; cf < 10; ++cf ) {
int pos = fir[cf][0];
if( pos ) {
d[ 1 ][ pos ][ cf%K ] = 1;
}
}
for( int lg = 1, ind = 1; lg <= B; ++lg, ind = 1-ind ) {
memset( d[1-ind], 0, sizeof(d[1-ind]) );
for( int i = 1; i <= N; ++i ) {
for( int r = 0; r < K; ++r ) {
for( int cf = 0; cf < 10; ++cf ) {
int pos = fir[cf][i+1];
if( pos ) {
int k = (10*r + cf) % K;
d[ 1-ind ][ pos ][ k ] += d[ ind ][ i ][ r ];
d[ 1-ind ][ pos ][ k ] %= MOD;
}
}
}
if( A <= lg ) {
Ans += d[ind][i][0];
Ans %= MOD;
}
}
}
out << Ans << '\n';
return 0;
}