Pagini recente » Cod sursa (job #3173190) | Cod sursa (job #2437690) | Cod sursa (job #692915) | Cod sursa (job #301609) | Cod sursa (job #7807)
Cod sursa(job #7807)
#include <stdio.h>
#include <string.h>
#define MOD 30103
long int k,a,b,n,rez,N[202],poz[11][202],v[202][101],v0[202][101],zece[202],aux0;
int rest(int x)
{
x%=k;
if (x<0) x+=k;
return x;
}
int main()
{
FILE *f;
f=fopen("diviz.in","r");
fscanf(f,"%d %d %d",&k,&a,&b);
n=0;
char c=fscanf(f,"%c",&c);
do{
c=fscanf(f,"%c",&c);
if (c<48 || c>57) c=-1;
else {
c-=48;
N[++n]=c;
}
}while (c>=0);
fclose(f);
for (int t=0;t<10;t++) poz[t][n+1]=-1;
for (int i=n;i>0;i--)
{
for (int t=0;t<10;t++) poz[t][i]=poz[t][i+1];
poz[N[i]][i]=i;
}
memset(v0,0,sizeof(v0));
zece[0]=1;
for (int i=1;i<=b;i++) zece[i]=(zece[i-1]*10)%k;
for (int i=1;i<=n+1;i++) v0[i][0]=1;
for (int c=1;c<=b;c++)
{
memset(v,0,sizeof(v));
aux0=0;
for (int i=1;i<=n;i++)
for (int r=0;r<k;r++)
{
for (int t=0;t<10;t++)
if (poz[t][i]>0)
{
int auxr=rest(r-zece[c-1]*t),
auxp=poz[t][i]+1;
v[i][r]=(v[i][r]+v0[auxp][auxr])%MOD;
if (i==1 && r==0 && t==0) aux0=v[i][r];
}
}
for (int i=0;i<=n+1;i++)
for (int r=0;r<k;r++)
v0[i][r]=v[i][r];
if (c>=a) rez=(rez+v[1][0]-aux0)%MOD;
}
f=fopen("diviz.out","w");
fprintf(f,"%d\n",rez);
fclose(f);
return 0;
}