Cod sursa(job #1629137)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 4 martie 2016 12:55:10
Problema Cifre Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <cstdio>
#define MAXCIF 11

using namespace std;

int a, b, c, k, rez;
int din[MAXCIF][MAXCIF]; /// nr de numere mai mici decat 10^i care au exact j cifre c

void prepare()
{
    din[1][1] = 1;
    din[1][0] = 9;
    for (int i = 2; i < MAXCIF; i++)
        for (int j = 0; j < MAXCIF; j++)
            din[i][j] = 9 * din[i-1][j] + (j == 0 ? 0 : din[i-1][j-1]);
}

int nrcif(int x)
{
    int r = 0;
    do {
		r++;
		x/= 10;
    }while (x);
    return r;
}

int solve(int nr, int cate)
{
	if (nr < 10) {
		if (cate == 1 && nr > c)
			return 1;
		if (cate == 0)
			return nr+(nr <= c)-1;
		return 0;
	}
    int p = nrcif(nr)-1;
    int ten = 1;
    for (int i = 1; i <= p; i++) ten*=10;
    if (nr == ten)
        return din[p][cate];
    int x = (nr%ten) + ten*(nr%ten == 0);
    return solve(nr-x, cate) + solve(x, cate-((nr-1)/ten == c));
}

int get(int x)
{
	int ret = 0;
	for (int i = k; i <= nrcif(x); i++)
		ret += solve(x, i);
	return ret;
}

int main()
{
	freopen("cifre.in", "r", stdin);
	freopen("cifre.out", "w", stdout);

	scanf("%d %d %d %d", &a, &b, &c, &k);
    prepare();
	rez = get(b+1) - get(a);

	printf("%.4lf", (1.0*rez)/(b-a+1));

	return 0;
}