Pagini recente » Cod sursa (job #2697118) | Cod sursa (job #2924681) | Cod sursa (job #2697561) | preONI 2008 - Clasament general, Clasa a 9-a | Cod sursa (job #675224)
Cod sursa(job #675224)
#include <fstream>
#include <iomanip>
#include <map>
using namespace std;
int A, B, C, K;
map<pair<int, int>, int> M;
map<pair<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(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, 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(n, k)] = result;
L[make_pair(n, k)] = 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) << 1.0 * x / (B - A + 1);
fin.close();
fout.close();
}