Pagini recente » Cod sursa (job #96352) | Cod sursa (job #261266) | Cod sursa (job #242943) | Cod sursa (job #52712) | Cod sursa (job #865481)
Cod sursa(job #865481)
#include <fstream>
#include <cstdio>
#include <cstring>
#define i64 long long
using namespace std;
ifstream cin("cifre.in");
ofstream cout("cifre.out");
int A, B, C, K;
char num[16];
int numDigits;
int dp[11][11][2];
int memo(int k,int numc,bool isLO) {
int &ret = dp[k][numc][isLO];
if(ret != -1) {
return ret;
}
ret = numc >= K;
if(k == numDigits) {
return ret;
}
int currDigit = num[k] - '0';
int Right = (isLO ? 10 : currDigit);
for(int c = (k == 0);c < Right;c++) {
ret += memo(k + 1,numc + (c == C),true);
}
if(isLO == false) {
ret += memo(k + 1,numc + (currDigit == C),false);
}
return ret;
}
int countNumbers(const int &val) {
if(val < 0) {
return 0;
}
if(!val) {
return (K <= 1 && C == 0);
}
sprintf(num,"%d",val);
numDigits = strlen(num);
memset(dp,-1,sizeof(dp));
return memo(0,0,0);
}
double solve() {
int ret = countNumbers(B) - countNumbers(A - 1);
return 1.0*ret/(B - A + 1);
}
int main()
{
cin>>A>>B>>C>>K;
cout.precision(4);
cout<<fixed<<solve();
return 0;
}