Pagini recente » Cod sursa (job #1006958) | Rating Axinte Silviu (Rynaqui) | Cod sursa (job #782106) | Cod sursa (job #2874705) | Cod sursa (job #2613997)
#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;
}
return sum;
}
int hasMin(int nr,int aparMin,int cif)
{
int apar=0;
while(nr)
{
if(nr%10==cif)
apar++;
nr/=10;
}
if(apar>=aparMin)
return apar-aparMin+1;
return 0;
}
int main()
{
in>>A>>B>>cif>>nrAp;
double long found=hasMin(A,nrAp,cif);
for(int i=nrAp;i<=10;i++)
found+=findNumere(B,i,cif)-findNumere(A,i,cif);
out<<setprecision(4)<<fixed<<found/(B-A+1);
return 0;
}