Pagini recente » Cod sursa (job #665939) | Cod sursa (job #2328) | Cod sursa (job #2743921) | Cod sursa (job #334932) | Cod sursa (job #2717166)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cifre.in");
ofstream fout("cifre.out");
int a, b, c, k, dp[10][10], v[15];
int nrCnt(int val)
{
int ax = val, nrCC = 0, ras = 0;
while(ax)
{
nrCC++;
ras = ras * 10 + ax % 10;
ax /= 10;
}
int rez = 0, z = 0, n = ras;
if(c == 0){
for(int i = nrCC - 1; i >= 1; --i)
rez += 9 * dp[i - 1][k];
z = 1;
}
for(int i = nrCC; i >= 1; --i){
if(n % 10 > c && k > 0 && z == 0)
rez += dp[i - 1][k - 1], --n;
rez += (n % 10 - z) * dp[i - 1][k];
if(n % 10 == c)
k = (k > 0 ? k - 1 : 0);
n /= 10;
z = 0;
}
if(k == 0)
++rez;
return rez;
}
int main()
{
fin >> a >> b >> c >> k;
dp[0][0] = 1;
for(int nrCif = 1; nrCif <= 9; ++nrCif)
{
dp[nrCif][0] = dp[nrCif - 1][0] * 9;
for(int cer = 1; cer <= 9; ++cer)
dp[nrCif][cer] = dp[nrCif - 1][cer] * 9 + dp[nrCif - 1][cer - 1];
}
for(int nrCif = 1; nrCif <= 9; ++nrCif)
for(int cer = 8; cer >= 0; -- cer)
dp[nrCif][cer] += dp[nrCif][cer + 1];
int axk = k;
int nr = nrCnt(b);
k = axk;
nr -= nrCnt(a - 1);
fout << fixed << setprecision(4) << nr / (double)(b - a + 1) << '\n';
return 0;
}