Pagini recente » Cod sursa (job #342775) | Cod sursa (job #2933284) | Cod sursa (job #1774003) | Cod sursa (job #1920456) | Cod sursa (job #112217)
Cod sursa(job #112217)
#include <cstdio>
#include <utility>
using std::pair;
using std::make_pair;
int A, B, C, K;
pair <int, int> first(int A)
{
int p10=1;
while(A>9)
{
A/=10;
p10*=10;
}
return make_pair(A,p10);
}
int solve(int A, int C, int K, bool can_I_put_0)
{
if(!K)
return A+1;
if(A<10)
return K==1 && A>=C;
pair <int, int> p = first(A);
int sol=0;
int tmp=solve(p.second-1,C,K,true);
for(int i=can_I_put_0==true ? 0 : 1; i<p.first; ++i)
if(i!=C)
sol+=tmp;
else
sol+=solve(p.second-1,C,K-1,true);
if(p.first==C && can_I_put_0)
sol+=solve(A%p.second,C,K-1,true);
else
sol+=solve(A%p.second,C,K,true);
return sol;
}
int main()
{
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
scanf("%d %d %d %d", &A, &B, &C, &K);
int cntB = solve(B,C,K,C!=0);
int cntA = (A==0) ? 0 : solve(A-1,C,K,C!=0);
printf("%.4lf\n",(double)(cntB-cntA)/(double)(B-A+1));
return 0;
}