Cod sursa(job #14865)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 10 februarie 2007 00:17:04
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>

#define maxn 210
#define maxx 110
#define maxl 10 
#define mod 30103

int n,m,x,y,sol;
char a[maxn];
int b[maxn][maxl];
int c[maxn][maxx],d[maxn][maxx];

int main()
{
    freopen("diviz.in","r",stdin);
    freopen("diviz.out","w",stdout);
    
    int i,j,k,p;
    
    scanf("%d %d %d ",&m,&x,&y);
    fgets(a,maxn,stdin);
    n=strlen(a)-2;
    
    for (i=0;i<maxl;i++) b[n][i]=n+1;
    
    for (i=n-1;i>=0;i--)
      for (j=0;j<maxl;j++)
        if (a[i+1]-'0'!=j) b[i][j]=b[i+1][j];
        else b[i][j]=i+1;

	for (p=1;p<maxl;p++)
	  if (a[0]-'0'==p) c[0][p%m]=1;
	  else if (b[0][p]!=n+1) c[b[0][p]][p%m]=1;


    for (i=1;i<=y;i++)
    {
        if (i>=x) 
          for (j=0;j<=n;j++) 
          {
              sol+=c[j][0];
              if (sol>mod) sol-=mod;
          }
        
        for (j=0;j<=n;j++)
          for (k=0;k<m;k++)
          {
              d[j][k]=c[j][k];
              c[j][k]=0;
          }
          
        for (j=0;j<=n;j++)
          for (k=0;k<m;k++)
            if (d[j][k]!=0)
              for (p=0;p<maxl;p++)
                if (b[j][p]!=n+1)
                {
                  c[b[j][p]][(k*10+p)%m]+=d[j][k];
                  if (c[b[j][p]][(k*10+p)%m]>mod) c[b[j][p]][(k*10+p)%m]-=mod;
                }                
    }
    
    printf("%d\n",sol);    
           
    return 0;
}