Pagini recente » Cod sursa (job #3287542) | Cod sursa (job #3183205) | Cod sursa (job #2917295) | Cod sursa (job #1398077) | Cod sursa (job #3230015)
#include <bits/stdc++.h>
using namespace std;
int comp(int nr, int count, int dig)
{
vector<int> v;
while(nr)
{
v.push_back(nr % 10);
nr /= 10;
}
reverse(v.begin(), v.end());
int n = v.size();
const int lim = 15;
int dp[n + 1][15][2];
memset(dp, 0, sizeof(dp));
dp[0][0][1] = 1;
for(int i = 1;i <= n;++i)
{
for(int j = 0;j < lim;++j)
{
//Don't use digit
dp[i][j][0] = 9 * dp[i - 1][j][0];
//Use digit
if(j)
dp[i][j][0] += dp[i - 1][j - 1][0];
int sub = 0;
if(dig < v[i - 1])
sub = 1;
dp[i][j][0] += (v[i - 1] - sub) * dp[i - 1][j][1];
if(sub && j)
dp[i][j][0] += dp[i - 1][j - 1][1];
if(dig == v[i - 1])
{
if(j)
dp[i][j][1] = dp[i - 1][j - 1][1];
}
else
dp[i][j][1] = dp[i - 1][j][1];
}
}
int ans = 0;
for(int i = count;i < lim;++i)
ans += dp[n][i][0] + dp[n][i][1];
return ans;
}
int main() {
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
int a, b, c, k;
cin >> a >> b >> c >> k;
if(!a)
{
int ret = comp(b, k, c);
cout << fixed << setprecision(5) << (double) ret / (b - a + 1);
}
else
{
int ret = comp(b, k, c) - comp(a - 1, k, c);
cout << fixed << setprecision(5) << (double) ret / (b - a + 1);
}
}