Pagini recente » Cod sursa (job #920465) | Cod sursa (job #50678) | Cod sursa (job #272534) | Cod sursa (job #2718426) | Cod sursa (job #2194475)
#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;
ifstream fin("cifre.in");
ofstream fout("cifre.out");
int st,dr;
int c,k;
int fact(int x)
{
int ans=1,i;
for(i=1;i<=x;i++)
ans*=i;
return ans;
}
int comb(int a,int b)
{
return fact(a)/(fact(b)*fact(a-b));
}
int expow(int a,int b)
{
int ans=1;
while(b>0)
{
if(b%2==1)
ans*=a;
a*=a;
b/=2;
}
return ans;
}
int fu(int a,int b)
{
return comb(a,b)*expow(9,a-b);
}
int f(int a,int b,int cnt) /// a pozitii, b nr, am pus deja cnt
{
if(cnt>b || b-cnt>a)
return 0;
return fu(a,b-cnt);
}
int cif[15];
int slove(int x)
{
int l=0,aux=x;
while(aux>0)
{
cif[++l]=aux%10;
aux/=10;
}
reverse(cif+1,cif+l+1);
int ans=0;
for(int i=1;i<l;i++)
{
int adun=0;
for(int j=k;j<=l;j++)
adun+=f(i-1,j,1);
for(int j=k;j<=l;j++)
adun+=8*f(i-1,j,0);
ans+=adun;
}
int cnt=0;
for(int p=0;p<l;p++)
{
if(cif[p]==c)
cnt++;
int cate=0,adun=0;
if(p==0)
cate=cif[p+1]-1;
else
cate=cif[p+1];
if(cate==0)
continue;
if(cif[p+1]>c)
{
for(int j=k;j<=l;j++)
adun+=f(l-p-1,j,cnt+1);
cate--;
}
if(cate==0)
{
ans+=adun;
continue;
}
for(int j=k;j<=l;j++)
adun+=cate*f(l-p-1,j,cnt);
ans+=adun;
}
int cate=0;
for(int j=1;j<=l;j++)
if(cif[j]==c)
cate++;
if(cate>=k)
ans++;
return ans;
}
int main()
{
fin>>st>>dr;
fin>>c>>k;
int nr=slove(dr)-slove(st-1),l=dr-st+1;
fout<<(double)nr/l;
return 0;
}
/**
**/