Pagini recente » Cod sursa (job #628398) | Cod sursa (job #2529487) | Cod sursa (job #2846773) | Cod sursa (job #2587969) | Cod sursa (job #157611)
Cod sursa(job #157611)
#include<stdio.h>
#include<string.h>
#define lg 205
#define BAZA 30103
int raspuns;
int a[2][lg][100], sr[11][lg];
char sir[lg];
int main()
{
freopen("diviz.in", "rt", stdin);
freopen("diviz.out", "wt", stdout);
int K, lg1, lg2, v[lg], n, nxt;
scanf("%d%d%d\n", &K, &lg1, &lg2);
scanf("%s", sir);
n = strlen(sir);
for (int i = 0; i < n; i ++)
v[i+1] = sir[i]-'0';
for (int j = 0; j < 10; j ++)
for (int i = n; i; i --){
if (v[i] == j)
sr[j][i] = i;
else
sr[j][i] = sr[j][i+1];
// printf("sr[%d][%d] este ---> %d\n", j, i, sr[j][i]);
}
for (int i = 1; i < 10; i ++)
a[0][sr[i][1]][i % K] = 1;
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= n; j ++){
if (i >= lg1 && i <= lg2){
raspuns += a[0][j][0];
while (raspuns >= BAZA)
raspuns -= BAZA;
}
for (int k = 0; k < K; k ++){
// printf("a[%d][%d][%d] este ---> %d\n", i, j, k, a[0][j][k]);
for (int cif = 0; cif < 10; cif ++){
nxt = sr[cif][j+1];
a[1][nxt][(k*10 + cif) % K] += a[0][j][k];
while (a[1][nxt][(k*10 + cif) % K] >= BAZA)
a[1][nxt][(k*10 + cif) % K] -= BAZA;
}
}
}
for (int j = 1; j <= n; j ++)
for (int k = 0; k < K; k ++)
a[0][j][k] = a[1][j][k], a[1][j][k] = 0;
}
printf("%d\n", raspuns);
return 0;
}