Pagini recente » Cod sursa (job #3304864) | Cod sursa (job #59284) | Cod sursa (job #3268910) | Cod sursa (job #3317423) | Cod sursa (job #3356511)
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <vector>
using namespace std;
ifstream f("cifre.in");
ofstream g("cifre.out");
const int DMAX = 10;
int dp[2][2][DMAX][DMAX];
int A, B, C, K;
void Reset()
{
for(bool equal : {false, true})
for(bool empty : {false, true})
for(int idx = 0; idx < DMAX; idx++)
for(int cnt = 0; cnt < DMAX; cnt++)
dp[equal][empty][idx][cnt] = -1;
}
vector<int> GetDigits(int val)
{
vector<int> dig;
do
{
dig.push_back(val % 10);
val /= 10;
}
while(val != 0);
reverse(dig.begin(), dig.end());
return dig;
}
int ComputeState(bool equal, bool empty, int idx, int cnt,
const vector<int>& digits, const int& C)
{
if(idx == (int)digits.size())
return (cnt >= K);
if(dp[equal][empty][idx][cnt] != -1)
return dp[equal][empty][idx][cnt];
int res = 0;
for(int dig = 0; dig < 10; dig++)
{
if(equal && dig > digits[idx])
break;
res += ComputeState(equal && (dig == digits[idx]),
empty && (dig == 0),
idx + 1,
cnt + (dig == C) * ((C == 0) ? !(empty & (dig == 0)) : 1),
digits, C);
}
return dp[equal][empty][idx][cnt] = res;
}
int CountNums(int val)
{
Reset();
if(val < 0)
return 0;
vector<int> digits = GetDigits(val);
return ComputeState(true, true, 0, 0, digits, C);
}
int main()
{
f >> A >> B >> C >> K;
double prob = (double)(CountNums(B) - CountNums(A - 1)) / (double)(B - A + 1);
g << fixed << setprecision(4) << prob << '\n';
f.close();
g.close();
return 0;
}