Pagini recente » Cod sursa (job #1733239) | Cod sursa (job #1916940) | Monitorul de evaluare | Cod sursa (job #1240468) | Cod sursa (job #846979)
Cod sursa(job #846979)
#include <iostream>
#include <fstream>
#include <iomanip>
#include <map>
using namespace std;
int A,B,C,K;
map<pair<pair<int, int>, bool>, int> M;
map<pair<pair<int, int>, bool>, bool> F;
int cifre(int x)
{
int cif=0;
while (x)
{
cif++;
x/=10;
}
return cif;
}
int rezolva(int n, int k,bool z)
{
if(F[make_pair(make_pair(n,k),z)]) return M[make_pair(make_pair(n,k),z)];
else
{
if(k<=0) return n+1;
else if(n<=9 && n>=C && k==1) return 1;
else if(n<=9) return 0;
int cif=cifre(n),aux=cif,putere,rezultat=0;;
for(putere=1;aux>1;--aux)
putere*=10;
for(int i=0; putere*(i+1)<=n;++i)
{
if(i!=0)
rezultat+=rezolva(putere-1,k - (i==C),true);
else
{
if(z)
rezultat+=rezolva(putere-1,k - (i==C),true);
else
rezultat+=rezolva(putere-1,k,false);
}
}
aux=n/putere;
int u=n-aux*putere;
int ucif=cifre(u);
rezultat+=rezolva(u,k-(aux==C)-(C==0 ? cif-ucif-1:0),true);
M[make_pair(make_pair(n,k),z)]=rezultat;
F[make_pair(make_pair(n,k),z)]=true;
return rezultat;
}
}
int main()
{
ifstream fin("cifre.in");
ofstream fout("cifre.out");
fin>>A>>B>>C>>K;
int a=rezolva(B,K,false)-(A == 0 ? 0:rezolva(A-1,K,false));
fout<<fixed<<setprecision(4)<<double(1.0)*a/(B-A+1);
fin.close();
fout.close();
return 0;
}