Cod sursa(job #865476)

Utilizator ELHoriaHoria Cretescu ELHoria Data 26 ianuarie 2013 15:51:36
Problema Cifre Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 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 a[16], b[16];
int dA, dB;

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'));
    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;
}

double solve() {
	int ret = 0;
	int isAZero = false;
	if(A == 0) {
		isAZero = true;
		A++;
		ret += (C == 0 && K <= 1);
	}
    sprintf(a,"%d",A);
    sprintf(b,"%d",B);
    dA = strlen(a);
    dB = strlen(b);
	memset(dp,-1,sizeof(dp));
	ret = memo(0,0,0,0);
	return 1.0*ret/(B - A + 1 + isAZero);
}
  
int main()
{
    cin>>A>>B>>C>>K;
	cout.precision(4);
	cout<<fixed<<solve();
    return 0;
}