Pagini recente » Cod sursa (job #1655178) | Cod sursa (job #1540462) | Cod sursa (job #1689652) | Cod sursa (job #1624835) | Cod sursa (job #112219)
Cod sursa(job #112219)
#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 lung(int A)
{
int z=0;
while(A>9)
{
z++;
A/=10;
}
return z;
}
int Comb(int n, int k)
{
if(k==0 || k==n)
return 1;
return Comb(n-1,k)+Comb(n-1,k-1);
}
int solve(int A, int C, int K)
{
if(!K)
return A+1;
if(A<10)
return K==1 && A>=C;
pair <int, int> p = first(A);
if(!C)
{
int sum=0, l=lung(p.second);
for(int tmp=K; tmp<=l; ++tmp)
sum+=Comb(l,tmp);
return p.first*sum+solve(A%p.second,C,K);
}
else
{
int sol=0;
int tmp=solve(p.second-1,C,K);
for(int i=0; i<p.first; ++i)
if(i!=C)
sol+=tmp;
else
sol+=solve(p.second-1,C,K-1);
if(p.first==C)
sol+=solve(A%p.second,C,K-1);
else
sol+=solve(A%p.second,C,K);
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);
int cntA = (A==0) ? 0 : solve(A-1,C,K);
printf("%.4lf\n",(double)(cntB-cntA)/(double)(B-A+1));
return 0;
}