Cod sursa(job #1239769)

Utilizator hrazvanHarsan Razvan hrazvan Data 9 octombrie 2014 19:26:32
Problema Diviz Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#define MAXL 200
#define BAZA 10
#define MAXK 100
#define MOD 30103

int next[MAXL + 1][BAZA], last[BAZA], n[MAXL + 1], tab[MAXL + 1][MAXL + 1][MAXK];

int main(){
  FILE *in = fopen("diviz.in", "r");
  int k, a, b, i, j, len;
  fscanf(in, "%d%d%d ", &k, &a, &b);
  char ch = fgetc(in);
  i = 1;
  len = 0;
  while(ch != '\n' && ch != EOF){
    len++;
    n[len] = ch - '0';
    for(j = i - 1; j >= last[n[len]]; j--)  next[j][n[len]] = i;
    last[n[len]] = i;
    i++;
    ch = fgetc(in);
  }
  fclose(in);
  for(i = 1; i < BAZA; i++){
    tab[1][next[0][i]][i % k] = 1;
  }
  int r, l;
  for(i = 1; i < b; i++){
    for(j = 1; j < len; j++){
      for(r = 0; r < k; r++){
        for(l = 0; l < BAZA; l++){
          if(next[i][l] != 0){
            tab[i + 1][next[j][l]][(r * 10 + l) % k] += tab[i][j][r];
            tab[i + 1][next[j][l]][(r * 10 + l) % k] %= MOD;
          }
        }
      }
    }
  }
  int rez = 0;
  for(i = a; i <= b; i++){
    for(j = 1; j <= len; j++){
      rez += tab[i][j][0];
      rez %= MOD;
    }
  }
  FILE *out = fopen("diviz.out", "w");
  fprintf(out, "%d", rez);
  fclose(out);
  return 0;
}