Pagini recente » Cod sursa (job #3179188) | Cod sursa (job #1198308) | Cod sursa (job #1198309) | Cod sursa (job #802723) | Cod sursa (job #2772505)
#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;
}