Cod sursa(job #153334)

Utilizator megabyteBarsan Paul megabyte Data 10 martie 2008 14:11:02
Problema Diviz Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#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;
}