Cod sursa(job #675348)

Utilizator darrenRares Buhai darren Data 7 februarie 2012 16:02:05
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <iomanip>
#include <map>

using namespace std;

int A, B, C, K;
map<pair<pair<int, int>, int>, int> M;
map<pair<pair<int, int>, int>, bool> L;

int numCif(int x)
{
	int result = 0;
	while (x != 0)
	{
		++result;
		x /= 10;
	}
	return result;
}
int getResult(int n, int k, bool can0)
{
	if (L[make_pair(make_pair(n, k), can0)]) return M[make_pair(make_pair(n, k), can0)];

	if (k <= 0) return n + 1;
	if (n <= 9 && n >= C && k == 1) return 1;
	else if (n <= 9)                return 0;
	
	int nrcif = numCif(n), pow10, auxnrcif = nrcif;
	for (pow10 = 1; auxnrcif > 1; --auxnrcif)
		pow10 *= 10;
	
	int result = 0;
	for (int i = 0; pow10 * (i + 1) <= n; ++i)
	{
		if (i != 0)
			result += getResult(pow10 - 1, k - (i == C), true);
		else
		{
			if (can0)
				result += getResult(pow10 - 1, k - (i == C), true);
			else
				result += getResult(pow10 - 1, k, false);
		}
	}
	
	int aux = n / pow10, next;
	next = n - aux * pow10;
	int auxcif = numCif(next);
	
	result += getResult(next, k - (aux == C) - (C == 0 ? nrcif - auxcif - 1 : 0), true);
	
	M[make_pair(make_pair(n, k), can0)] = result;
	L[make_pair(make_pair(n, k), can0)] = true;
	return result;
}

int main()
{
	ifstream fin("cifre.in");
	ofstream fout("cifre.out");
	
	fin >> A >> B >> C >> K;
	
	int x = getResult(B, K, false) - (A == 0 ? 0 : getResult(A - 1, K, false));
	fout << fixed << setprecision(4) << double(1.0) * x / (B - A + 1);
	
	fin.close();
	fout.close();
}