Cod sursa(job #675174)

Utilizator darrenRares Buhai darren Data 7 februarie 2012 13:07:47
Problema Cifre Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#include <iomanip>
#include <map>

using namespace std;

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

int numCif(int x)
{
	int result = 0;
	while (x != 0)
	{
		++result;
		x /= 10;
	}
	return result;
}
int getResult(int n, int k)
{
	if (M[make_pair(n, k)]) return M[make_pair(n, k)];
	
	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;
	for (pow10 = 1; nrcif > 1; --nrcif)
		pow10 *= 10;
	
	int result = 0;
	result += getResult(pow10 - 1, k);
	for (int i = 1; pow10 * (i + 1) <= n; ++i)
		result += getResult(pow10, k - (i == C));
	
	int aux = n / pow10;
	n = n - aux * pow10;
	result += getResult(n, k - (aux == C));
	
	M[make_pair(n, k)] = result;
	return result;
}

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