Cod sursa(job #526596)

Utilizator AndreyPAndrei Poenaru AndreyP Data 28 ianuarie 2011 19:43:57
Problema Cifre Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#define N 11

int a[N][N];
int c,k,ks;

inline void precalc() {
	a[1][0] = 9;
	a[1][1] = 1;

	for(int i=2; i<10; ++i) {
		a[i][0] = a[i-1][0]*9;
		for(int j=1; j<=i; ++j)
			a[i][j] = a[i-1][j]*9 + a[i-1][j-1];
	}

	for(int i=1; i<10; ++i) {
		for(int j=i-1; j>=0; --j)
			a[i][j] += a[i][j+1];
	}
}

inline int rezolva(int nr) {
	k = ks;
	if(nr<0)
		return 0;

	int v[N]={0};
	while(nr!=0) {
		v[++v[0]] = nr%10;
		nr /= 10;
	}

	int ret = 0;

	for(int i=v[0]; i>1; --i) {
		for(int j=0; j<v[i]; ++j) {
			if(j==c && k>0 && (c!=0 || i!=v[0]))
				ret += a[i-1][k-1];
			else
				ret += a[i-1][k];
		}
		if(v[i]==c && k>0)
			--k;
	}
        
	if(k==0)
		ret += v[1]+1;
	if(k==1 && c<=v[1])
		++ret;
		
        return ret;
}

int main() {
	freopen("cifre.in","r",stdin);
	freopen("cifre.out","w",stdout);

	int a,b;
	scanf("%d%d%d%d",&a,&b,&c,&k);
	ks = k;
	if(k==0) {
		fputs("1.0000\n",stdout);
		return 0;
	}
        precalc();

	int aux = rezolva(b)-rezolva(a-1);

	printf("%.4lf\n",(double)aux/(double)(b-a+1));

	return 0;
}