Cod sursa(job #865487)

Utilizator ELHoriaHoria Cretescu ELHoria Data 26 ianuarie 2013 16:12:26
Problema Cifre Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#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;
}