Cod sursa(job #7565)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 21 ianuarie 2007 17:55:40
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <string.h>

#define MOD 30103 
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;

	//fprintf(stderr, "%d\n", '\n');

    do{
   	   c = -1;
       c=fgetc(f);
       if (c!=10) {
                    c-=48;
                    N[++n]=c;
                 }
    }while (c!=10);
    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)%MOD;
    }
    
    f=fopen("diviz.out","w");
    fprintf(f,"%d\n",rez);
    fclose(f);

    return 0;
}