Pagini recente » Cod sursa (job #3209306) | Cod sursa (job #2434289)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cifre.in");
ofstream out("cifre.out");
int c, k;
int dp[11][11][2];
int f(int p)
{
if(p <= 0)
return 0;
string v;
while(p)
{
v.push_back(p % 10);
p /= 10;
}
reverse(v.begin(), v.end());
int n = v.size();
memset(dp, 0, sizeof(dp));
for(int i = 1; i < v[0]; i++)
if(i == c)
dp[1][1][1] = 1;
else
dp[1][0][1] = 1;
if(v[0] == c)
dp[1][1][0] = 1;
else
dp[1][0][0] = 1;
int nr = dp[1][1][0] + dp[1][0][0];
for(int i = 1; i < n; i++)
{
for(int j = 1; j < v[i]; j++)
if(j == c)
dp[i + 1][1][1] = 1;
else
dp[i + 1][0][1] = 1;
if(v[i] == c)
{
nr++;
}
dp[i + 1][nr][0] = 1;
}
for(int i = 2; i <= n; i++)
{
for(int j = 0; j <= 9; j++)
{
for(int t = 0; t <= 9; t++)
if(t == c)
dp[i][j + 1][1] += dp[i - 1][j][1];
else
dp[i][j][1] += dp[i - 1][j][1];
for(int t = 0; t < v[i - 1]; t++)
if(t == c)
dp[i][j + 1][1] += dp[i - 1][j][0];
else
dp[i][j][1] += dp[i - 1][j][0];
}
}
int sum = 0;
for(int i = k; i <= 10; i++)
sum += dp[n][i][1] + dp[n][i][0];
return sum;
}
main()
{
int a, b;
in >> a >> b;
in >> c >> k;
int fav = f(b) - f(a - 1);
int all = b - a + 1;
out << fixed << setprecision(5) << (fav * 1.0 / all);
}