Cod sursa(job #7957)

Utilizator georgianaGane Andreea georgiana Data 23 ianuarie 2007 14:21:01
Problema Diviz Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <string.h>

#define MOD 30103 

char N[202];
long int k,a,b,n,rez,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);
    fscanf(f,"%s",N+1);
    n=strlen(N+1);

    fclose(f);
    for (int i=1;i<=n;i++) N[i]-=48;
    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;
}