Cod sursa(job #1553918)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 20 decembrie 2015 18:19:27
Problema Diviz Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#define MAXN 200
#define MAXK 100
#define MOD 30103
int v[MAXN],mat[10][MAXN+1],d[MAXN+1][MAXK][2];
int main(){
    FILE*fi,*fout;
    int i,j,n,k,a,b,con,cif,r;
    char c;
    fi=fopen("diviz.in" ,"r");
    fout=fopen("diviz.out" ,"w");
    fscanf(fi,"%d%d%d" ,&k,&a,&b);
    c=fgetc(fi);
    c=fgetc(fi);
    n=0;
    while(c>='0'&&c<='9'){
        v[++n]=c-'0';
        c=fgetc(fi);
    }
    for(cif=0;cif<=9;cif++){
        i=0;
        while(i<n){
            j=i+1;
            while(j<=n&&v[j]!=cif)
                j++;
            if(j==n+1)
                i=n;
            else{
               while(i<j){
                  mat[cif][i]=j;
                  i++;
               }
            }
        }
    }
    con=0;
    for(i=1;i<=9;i++)
        if(mat[i][0]>0)
           d[mat[i][0]][i%k][0]=1;
    for(j=1;j<=b;j++){
     for(i=j;i<n;i++){
       for(r=0;r<k;r++)
         for(cif=0;cif<=9;cif++)
            if(mat[cif][i]>0)
                d[mat[cif][i]][(r*10+cif)%k][j&1]=d[mat[cif][i]][(r*10+cif)%k][j&1]+d[i][r][1-j&1];
        for(cif=0;cif<=9;cif++)
               d[mat[cif][i]][(r*10+cif)%k][j&1]%=MOD;
     }
       for(i=j;i<=n;i++)
          if(j>=a&&j<=b)
            con=con+d[i][0][1-j&1];
       con=con%MOD;
       for(i=j;i<=n;i++)
          for(r=0;r<k;r++)
             d[i][r][1-j&1]=0;
    }
    fprintf(fout,"%d" ,con);
    fclose(fi);
    fclose(fout);
    return 0;
}