Cod sursa(job #2772509)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 1 septembrie 2021 13:39:23
Problema Cifre Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 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)
{
    if (n == 0)
        return 0;

    int nc[10] = {}, ap[10] = {};
    int i, j, it;
    int rasp;

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

    if (c > 0)
    {
        rasp = 0;
        for (i = nc[0]; i>=1; i--)
        {
            for (j = 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]]++;
        }
    }
    else
    {
        rasp = 0;
        //numere cu mai putin cu nc[0] cifre
        for (i = 1; i<nc[0]; i++)
            for (j = k; j<10; j++)
                rasp = rasp + 9 * val[i-1][j];
        if (k <= 1)
            rasp++;

        //numere cu nc[0] cifre
        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 >> c >> k;
    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;
}