Cod sursa(job #1817959)

Utilizator TincaMateiTinca Matei TincaMatei Data 28 noiembrie 2016 18:28:52
Problema Cifre Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>

int p10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int p9[10];
int comb[10][10];

int factorial(int n) {
  int r = 1;
  for(int i = 1; i <= n; ++i)
    r = r * i;
  return r;
}

int query(int i, int j, int pref, int comp, int c, int k) {
  int rez, a, b;
  a = pref * p10[comp];
  b = (pref + 1) * p10[comp] - 1;
  if(b < i || j < a)
    return 0;
  else if(i <= a && b <= j) {
    if(comp < k)
      return 0;
    if(k < 0)
      return b - a + 1;
    rez = rez + p10[comp];
    for(k = k - 1; k >= 0; --k)
      rez = rez - factorial(comp) / factorial(k) / factorial(comp - k) * p9[comp - k];
    return rez;
  } else {
    rez = 0;
    for(int cf = 0; cf < 10; ++cf)
      rez = rez + query(i, j, pref * 10 + cf, comp - 1, c, k - (cf == c));
    return rez;
  }
}

int main() {
  int a, b, c, k;
  p9[0] = 1;
  for(int i = 1; i <= 9; ++i)
    p9[i] = p9[i - 1] * 9;
  FILE *fin = fopen("cifre.in", "r");
  fscanf(fin, "%d%d%d%d", &a, &b, &c, &k);
  fclose(fin);

  FILE *fout = fopen("cifre.out", "w");
  fprintf(fout, "%0.4f", (double)query(a, b, 0, 9, c, k) / (b - a + 1));
  fclose(fout);
  return 0;
}