Cod sursa(job #1774482)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 9 octombrie 2016 00:05:48
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#define MAXN 200
#define MOD 30103
#define MAXCIF 10
#define MAXK 100
char v[MAXN+2];
int poz[MAXCIF][MAXN+1];
int dp[MAXN+2][2][MAXK];
int main(){
   FILE*fi,*fout;
   int k,a,b,n,i,j,p,cif,ans;
   char ch;
   fi=fopen("diviz.in" ,"r");
   fout=fopen("diviz.out" ,"w");
   fscanf(fi,"%d %d %d " ,&k,&a,&b);
   ch=fgetc(fi);
   n=0;
   while(ch>='0'&&ch<='9'){
      v[++n]=ch-'0';
      ch=fgetc(fi);
   }
   for(i=0;i<MAXCIF;i++)
    for(j=1;j<=n;j++){
       if(poz[j-1][i]>=j)
          poz[j][i]=poz[j-1][i];
       else{
          p=j;
          while(p<=n&&v[p]!=i)
             p++;
          if(p>n)
             p=0;
          poz[j][i]=p;
       }
    }
   ans=0;
   for(i=1;i<MAXCIF;i++)
    if(poz[1][i]>0){
      dp[poz[1][i]][1][i%k]=1;
      if(a==1&&i%k==0)
        ans++;
    }
   for(j=1;j<b;j++){
     for(i=1;i<=n;i++)
      for(p=0;p<k;p++)
        dp[i][1-j&1][p]=0;
     for(i=j;i<n;i++)
       for(p=0;p<k;p++)
        for(cif=0;cif<MAXCIF;cif++)
         if(poz[i+1][cif]>0){
           dp[poz[i+1][cif]][1-j&1][(p*10+cif)%k]+=dp[i][j&1][p];
           if(dp[poz[i+1][cif]][1-j&1][(p*10+cif)%k]>=MOD)
             dp[poz[i+1][cif]][1-j&1][(p*10+cif)%k]-=MOD;
         }
       if(j+1>=a)
        for(i=j+1;i<=n;i++){
          ans+=dp[i][1-j&1][0];
          if(ans>=MOD)
            ans-=MOD;
        }
   }
   fprintf(fout,"%d" ,ans);
   fclose(fi);
   fclose(fout);
   return 0;
}