Pagini recente » Cod sursa (job #153169) | Cod sursa (job #865487)
Cod sursa(job #865487)
#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 = (int)(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) + (K <= 1 && C == 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;
}