Cod sursa(job #1583719)

Utilizator hrazvanHarsan Razvan hrazvan Data 29 ianuarie 2016 11:36:03
Problema Cifre Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#define CIF 10
long long d[CIF + 1][CIF + 1];

inline void precalc(){
  long long i, j;
  d[0][0] = 1;
  for(i = 1; i <= CIF; i++){
    for(j = 0; j <= CIF; j++){
      d[i][j] += (CIF - 1) * d[i - 1][j];
      if(j != 0)
        d[i][j] += d[i - 1][j - 1];
    }
  }
}

inline long long solve(long long x, long long c, long long k){
  long long p = 1, n = 0, s = 0, rez = 0;
  while(p <= x / 10){
    p *= 10;
    n++;
  }
  for(; n >= 0; n--){
    if(c < x / p)
      rez += x / p * d[n][k - s] + d[n][k - s - 1];
    else
      rez += (x / p + 1) * d[n][k - s];
    if(c == x / p)
      s++;
    x %= p;
    p /= 10;
  }
  return rez;
}

int main(){
  precalc();
  FILE *in = fopen("cifre.in", "r");
  long long a, b, c, k;
  fscanf(in, "%lld%lld%lld%lld", &a, &b, &c, &k);
  a--;
  long long rez = solve(b, c, k) - solve(a, c, k);
  FILE *out = fopen("cifre.out", "w");
  fprintf(out, "%.4lf", 1.0 * rez / (b - a));
  fclose(out);
  return 0;
}