Pagini recente » Cod sursa (job #48635) | Cod sursa (job #73145) | Cod sursa (job #471858) | Cod sursa (job #269095) | Cod sursa (job #153334)
Cod sursa(job #153334)
#include <stdio.h>
#include <string.h>
#define INF "diviz.in"
#define OUF "diviz.out"
const short KMAX=100;
const short LMAX=204;
const int CLB=30103;
int nr[2][LMAX][KMAX]={0}; //lng subsir, poz sfarsit subsir, rest
int main()
{
FILE *in,*out;
in=fopen(INF,"r");
out=fopen(OUF,"w");
short i,j,r,c,ii,rr,n,k,a,b,p,q;
short fap[10][LMAX]={0},cif[LMAX];
int sol;
char buf[LMAX];
fscanf(in,"%hd%hd%hd\n",&k,&a,&b);
fgets(buf,LMAX,in);
n=strlen(buf);
for(i=1;i<=n;++i) cif[i]=(buf[i-1]-'0');
for(j=0;j<10;++j) fap[j][n+1]=0;
for(i=n;i>0;--i)
for(j=0;j<10;++j)
{
fap[j][i]=fap[j][i+1];
if(cif[i]==j) fap[j][i]=i;
}
p=0;q=1;sol=0;
j=1;//lungimea subsirului
for(c=1;c<10;++c)
{
nr[p][fap[c][1]][c%k]+=1;
if(a==1&&fap[c][1]) sol+=nr[p][fap[c][1]][0];
}
for(j=1;j<b;++j) //lng subsir
{
for(i=1;i<=n;++i)
for(r=0;r<k;++r) nr[q][i][r]=0;
for(i=1;i<n;++i) //poz term
for(r=0;r<k;++r) //rest
for(c=0;c<10;++c) //cifra
{
ii=fap[c][i+1];
if(ii)
{
rr=(r*10+c)%k;
nr[q][ii][rr]+=nr[p][i][r];
if(nr[q][ii][rr]>=CLB) nr[q][ii][rr]-=CLB;
}
}
if(a<=j+1)
for(i=1;i<=n;++i) sol=(sol+nr[q][i][0])%CLB;
r=p;p=q;q=r;
}
fprintf(out,"%d",(sol%CLB));
fclose(in);fclose(out);
return 0;
}