Pagini recente » Cod sursa (job #1508835) | Cod sursa (job #2390863) | Cod sursa (job #1178101) | Cod sursa (job #1280830) | Cod sursa (job #2614026)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cifre.in");
ofstream out("cifre.out");
int A,B,nrAp,cif;
long long fact(int nr)
{
long long p=1;
while(nr)
p*=nr--;
return p;
}
int combinari(int n,int k)
{
if(n<k)
return 0;
long long rez=fact(n)/(fact(n-k)*fact(k));
return rez;
}
int putere(int nr,int times)
{
if(times<0)
return 0;
int p=1;
while(times--)
p*=nr;
return p;
}
int findNumere(int maxim, int aparTot, int cif)
{
int l=log10(maxim)+1,poz[11];
for(int i=l;i>=1;i--)
{
poz[i]=maxim%10;
maxim/=10;
}
int aparLoc=0,sum=0;
for(int i=1;i<l;i++)
if(poz[i]>cif)
{
sum+=(poz[i]-1)*combinari(l-i,aparTot-aparLoc)*putere(9, l-i-(aparTot-aparLoc) );
if(aparLoc<aparTot)
sum+=combinari(l-i,aparTot-aparLoc-1)*putere(9, l-i-(aparTot-aparLoc-1) );
}
else
{
sum+=poz[i]*combinari(l-i,aparTot-aparLoc)*putere(9, l-i-(aparTot-aparLoc) );
if(poz[i]==cif)
aparLoc++;
if(aparLoc>aparTot)
break;
}
if(aparTot-aparLoc==1 && poz[l]>=cif)
sum++;
else if(aparTot==aparLoc)
sum+=poz[l]+1-(poz[l]>=cif?1:0);
return sum;
}
int main()
{
in>>A>>B>>cif>>nrAp;
double long found=0;
for(int i=nrAp;i<=10;i++)
found+=findNumere(B,i,cif)-findNumere(A-1,i,cif);
out<<setprecision(4)<<fixed<<found/(B-A+1);
return 0;
}