Pagini recente » Cod sursa (job #2380547) | Cod sursa (job #1819396) | Monitorul de evaluare | Cod sursa (job #847085) | Cod sursa (job #3230150)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 15;
int comb[nmax][nmax];
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;
}
void pre()
{
for(int i = 0;i < nmax;++i)
comb[i][i] = comb[i][0] = 1;
for(int i = 1;i < nmax;++i)
for(int j = 1;j < i;++j)
comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
}
int comp(int n, int k)
{
int ans = 0;
for(int i = 1;i < n;++i)
{
int zero = n - i;
for(int j = 0;j < k;++j)
if(zero + j >= k && j <= i)
ans += comb[i - 1][j] * pow(9, i - j);
}
return ans;
}
int digs(int nr)
{
int ans = 0;
if(!nr)
ans = 1;
while(nr)
nr /= 10, ++ans;
return ans;
}
int main() {
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
int a, b, c, k;
cin >> a >> b >> c >> k;
pre();
if(!a)
{
int ret = comp(b, k, c);
if(!c)
ret -= comp(digs(b), k);
cout << fixed << setprecision(5) << (double) ret / (b - a + 1);
}
else
{
int suba = 0, subb = 0;
if(!c)
suba = comp(digs(a - 1), k), subb = comp(digs(b), k);
int ret = comp(b, k, c) - subb - comp(a - 1, k, c) + suba;
cout << fixed << setprecision(5) << (double) ret / (b - a + 1);
}
}