Cod sursa(job #1774454)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 8 octombrie 2016 23:23:34
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 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][MAXN+1][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++;
          poz[j][i]=p;
       }
    }
   for(i=1;i<MAXCIF;i++)
     dp[poz[1][i]][1][i%k]=1;
   for(i=1;i<n;i++)
    for(j=1;j<b&&j<=i;j++)
     for(p=0;p<k;p++)
       for(cif=0;cif<MAXCIF;cif++){
         dp[poz[i+1][cif]][j+1][(p*10+v[poz[i+1][cif]])%k]+=dp[i][j][p];
         if(dp[poz[i+1][cif]][j+1][(p*10+v[poz[i+1][cif]])%k]>=MOD)
           dp[poz[i+1][cif]][j+1][(p*10+v[poz[i+1][cif]])%k]-=MOD;
       }
   ans=0;
   for(j=1;j<=n;j++)
     for(i=a;i<=b;i++){
      ans+=dp[j][i][0];
      if(ans>=MOD)
        ans-=MOD;
     }
   fprintf(fout,"%d" ,ans);
   fclose(fi);
   fclose(fout);
   return 0;
}