Cod sursa(job #865462)
#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 a[16], b[16];
int dA, dB;
int NUM;
int dp[11][10][2][2];
int memo(int k,int numc,bool isGOE,bool isLOE) {
int &ret = dp[k][numc][isGOE][isLOE];
if(ret != -1) {
return ret;
}
ret = (k >= dA && numc >= K);
if(k == dB) {
return ret;
}
int Left = (isGOE ? 0 : (a[k] - '0'));
int Right = (isLOE ? 9 : (b[k] - '0'));
if(k < dB) {
for(int c = Left;c <= Right;c++) {
ret += memo(k + 1,numc + (c == C),isGOE || c > (a[k] - '0') || k + 1 == dA,isLOE || c < (b[k] - '0'));
}
}
return ret;
}
int main()
{
cin>>A>>B>>C>>K;
if(!A) {
NUM += (C == 0 && K <= 1);
A++;
}
sprintf(a,"%d",A);
sprintf(b,"%d",B);
dA = strlen(a);
dB = strlen(b);
memset(dp,-1,sizeof(dp));
NUM += memo(0,0,0,0);
cout.precision(4);
double ans = 1.0*NUM/(B - A + 1);
cout<<ans;
return 0;
}