Cod sursa(job #20509)

Utilizator georgianaGane Andreea georgiana Data 21 februarie 2007 17:36:42
Problema Diviz Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 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;

inline int modulo(int x)
{
   while (x>=k) x-=k;
   while (x<0) x+=k;
   return x;
}

inline int Modulo(int x)
{
   while (x>=MOD) x-=MOD;
   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]=modulo(zece[i-1]*10);
    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=modulo(r-zece[c-1]*t),
                              auxp=poz[t][i]+1;
                          v[i][r]=Modulo(v[i][r]+v0[auxp][auxr]);
                          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=Modulo(rez+v[1][0]-aux0);
    }
    
    f=fopen("diviz.out","w");
    fprintf(f,"%d\n",rez);
    fclose(f);

    return 0;
}