Pagini recente » Cod sursa (job #1364137) | Cod sursa (job #783435) | Cod sursa (job #1931503) | Cod sursa (job #575964) | Cod sursa (job #8397)
Cod sursa(job #8397)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long a[201][100],aa[201][100],tot;
int aux,cc,n,aaa,b,k,i,j,r,t[201],cif[201][10];
int max_cif=10;
long mod=30103;
char c[200];
FILE *f;
void citire()
{
f=fopen("diviz.in", "r");
fscanf(f,"%d %d %d\n",&k,&aaa,&b);
fscanf(f,"%s",c);
n=strlen(c);
for (i=0;i<n;++i)
t[i]=c[i]-'0';
fclose(f);
}
void cifre()
{
for (j=0;j<max_cif;++j)
cif[n-1][j]=-1;
cif[n-1][t[n-1]]=n-1;
for (i=n-2;i>=0;--i)
{
memcpy(cif[i],cif[i+1],sizeof(cif[i+1]));
cif[i][t[i]]=i;
}
}
void dinamica()
{
for (i=1;i<max_cif;++i)
if (cif[0][i]!=-1)
{
aa[cif[0][i]][i%k]=1;
if ((i%k==0)&&(1>=aaa)) tot+=aa[cif[0][i]][i%k];
}
tot%=mod;
for (i=2;i<aaa;++i)
{
memset(a,0,sizeof(a));
for (j=i-2;j<n-1;++j)
{
for (r=0;r<k;++r)
for (cc=0;cc<max_cif;++cc)
if (cif[j+1][cc] != -1)
{
aux=((r*10)+cc)%k;
a[cif[j+1][cc]][aux] += aa[j][r];
if (a[cif[j+1][cc]][aux]>mod)
a[cif[j+1][cc]][aux]-=mod;
}
}
memcpy(aa,a,sizeof(a));
}
for (i=aaa;i<=b;++i)
{
memset(a,0,sizeof(a));
for (j=i-2;j<n-1;++j)
{
for (r=0;r<k;++r)
for (cc=0;cc<max_cif;++cc)
if (cif[j+1][cc] != -1)
{
aux=((r*10)+cc)%k;
a[cif[j+1][cc]][aux] += aa[j][r];
if (a[cif[j+1][cc]][aux]>mod)
a[cif[j+1][cc]][aux]-=mod;
}
}
for (j=1;j<n;++j)
tot+=a[j][0];
tot %= mod;
memcpy(aa,a,sizeof(a));
}
}
int main()
{
citire();
cifre();
dinamica();
f=fopen("diviz.out","w");
fprintf(f,"%ld",tot);
fclose(f);
return 0;
}