Cod sursa(job #1774757)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 9 octombrie 2016 13:49:16
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <cstring>
#define MAXN 200
#define MOD 30103
#define MAXCIF 10
#define MAXK 100
char v[MAXN+2];
int poz[MAXN+1][MAXCIF];
int dp[2][MAXN+2][MAXK];
int main(){
   FILE*fi,*fout;
   int k,a,b,n,i,j,p,cif,ans,r,x;
   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[1][poz[1][i]][i%k]=1;
      if(a==1&&i%k==0)
        ans++;
    }
   for(j=1;j<b;j++){
     memset(dp[1-j&1],0,sizeof(dp[1-j&1]));
     for(i=j;i<n;i++)
       for(p=0;p<k;p++)
        if(dp[j&1][i][p]>0)
        for(cif=0;cif<MAXCIF;cif++){
         x=poz[i+1][cif];
         if(x>0){
           r=(p*10+cif)%k;
           dp[1-j&1][x][r]+=dp[j&1][i][p];
           if(dp[1-j&1][x][r]>=MOD)
             dp[1-j&1][x][r]-=MOD;
         }
       }
       if(j+1>=a)
        for(i=j+1;i<=n;i++){
          ans+=dp[1-j&1][i][0];
          if(ans>=MOD)
            ans-=MOD;
        }
   }
   fprintf(fout,"%d" ,ans);
   fclose(fi);
   fclose(fout);
   return 0;
}