Cod sursa(job #2923851)

Utilizator AztecaVlad Tutunaru 2 Azteca Data 20 septembrie 2022 00:21:32
Problema Cifre Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>

using ll = long long;

const int MAX_N = 10;
const int LT = 0;
const int EQ = 1;
const int GT = 2;

int dp[1 + MAX_N][3][1 + MAX_N];

int query(std::string s, int c, int k) {
  memset(dp, 0, sizeof(dp));
  int n = s.size();
  for (int d = 1; d <= 9; d++) {
    int add = (d == c);
    if (d < s[0] - '0') {
      dp[1][LT][add]++;
    } else if (d == (s[0] - '0')) {
      dp[1][EQ][add]++;
    } else {
      dp[1][GT][add]++;
    }
  }
  for (int i = 2; i <= n; i++) {
    for (int d = 0; d <= 9; d++) {
      int add = (d == c);
      for (int fr = add; fr <= i; fr++) {
        if (d < s[i - 1] - '0') {
          dp[i][LT][fr] += dp[i - 1][LT][fr - add];
          dp[i][LT][fr] += dp[i - 1][EQ][fr - add];
          dp[i][GT][fr] += dp[i - 1][GT][fr - add];
        } else if (d == s[i - 1] - '0') {
          dp[i][LT][fr] += dp[i - 1][LT][fr - add];
          dp[i][EQ][fr] += dp[i - 1][EQ][fr - add];
          dp[i][GT][fr] += dp[i - 1][GT][fr - add];
        } else {
          dp[i][LT][fr] += dp[i - 1][LT][fr - add];
          dp[i][GT][fr] += dp[i - 1][EQ][fr - add];
          dp[i][GT][fr] += dp[i - 1][GT][fr - add];
        }
      }
    }
  }
  int answer = 0;
  for (int j = k; j <= n; j++) {
    for (int i = 1; i <= n; i++) {
      answer += dp[i][LT][j];
      answer += dp[i][EQ][j];
      if (i < n) {
        answer += dp[i][GT][j];
      }
    }
  }
  return answer;
}

int main() {
  std::ifstream fin("cifre.in");
  std::ofstream fout("cifre.out");
  int a, b, c, k;
  fin >> a >> b >> c >> k;
  long double y = b - a + 1;
  a--;
  std::string A = "";
  if (a == 0) {
    A += "0";
  }
  while (a > 0) {
    A += char('0' + a % 10);
    a /= 10;
  }
  std::reverse(A.begin(), A.end());
  std::string B = "";
  while (b > 0) {
    B += char('0' + b % 10);
    b /= 10;
  }
  std::reverse(B.begin(), B.end());
  int x = query(B, c, k) - query(A, c, k);
  fout << x << "\n";
  long double answer = (long double)(x / y);
  fout << std::setprecision(4) << std::fixed << answer;
  return 0;
}