Cod sursa(job #2772505)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 1 septembrie 2021 13:18:44
Problema Cifre Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

ifstream fin ("cifre.in");
ofstream fout ("cifre.out");

int comb[10][10];
int p[10];
int val[10][10]; //val[i][j] = numarul de numere cu i cifre (inclusiv zerourile de la inceput) ce au j cifre egale cu c

int calc (int n, int k, int c) //[0, n-1)
{
    int nc[10] = {}, ap[10] = {};
    int i, j, it;
    int rasp = 0;

    do
    {
        nc[++nc[0]] = n%10;
        n = n/10;
    } while (n > 0);

    if (c == 0)
    {
        for (i = 1; i<nc[0]; i++)
            for (j = k; j<10; j++)
                rasp = rasp + 9 * val[i-1][j];
    }
    else
    {
        for (j = k; j<10; j++)
            rasp = rasp + val[nc[0]-1][j];
    }

    for (i = nc[0]; i>=1; i--)
    {
        for (j = (i == nc[0]); j<nc[i]; j++)
        {
            ap[j]++;
            for (it = max(0, k - ap[c]); it<10; it++)
                rasp = rasp + val[i-1][it];
            ap[j]--;
        }
        ap[nc[i]]++;
    }

    return rasp;
}

int main()
{
    int a, b, k, c, i, j;

    for (i = 0; i<10; i++)
        comb[i][0] = 1;
    for (i = 1; i<10; i++)
        for (j = 1; j<=i; j++)
            comb[i][j] = comb[i-1][j] + comb[i-1][j-1];

    p[0] = 1;
    for (i = 1; i<10; i++)
        p[i] = 9 * p[i-1];

    fin >> a >> b >> k >> c;
    for (i = 0; i<10; i++)
        for (j = 0; j<=i; j++)
            val[i][j] = comb[i][j] * p[i-j];

    int x = calc(b+1, k, c) - calc(a, k, c);
    int y = b-a+1;

    fout << fixed << setprecision(4) << double(x)/y;
    return 0;
}