Cod sursa(job #549857)

Utilizator mihai995mihai995 mihai995 Data 8 martie 2011 23:50:03
Problema Cifre Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <cstdio>
using namespace std;

int v[10][10],a,b,k,C;

ifstream in("cifre.in");

int inv(int x)
{
	int q;
	for (q=0;x;q=q*10+x%10,x/=10);
	return q;
}

int ncif(int x)
{
	int p;
	for (p=0;x;x/=10,p++);
	return p;
}

inline int max(int a,int b)
{
	return a>b ? a:b;
}

bool ok(int x)
{
	int i;
	for (i=0;x;x/=10)
		i+=(x%10==k);
	return i>=C;
}

int nr(int x)
{
	int rez=ok(x),nr=C,q=ncif(x)-1;
	for (x=inv(x);x;x/=10,q--)
	{
		if (x%10<=k)
			rez+=(x%10)*v[q][max(nr,0)];
		else
			rez+=max(x%10-1,0)*v[q][max(nr,0)]+v[q][max(nr-1,0)]*(k!=0);
		nr-=(x%10==k);
	}
	return rez;
}

int main()
{
	v[0][0]=1;
	int q=9;
	in>>a>>b>>k>>C;
	if (!k)
	{
		q=8;
		v[0][1]=1;
		v[0][0]=0;
	}
	for (int i=1;i<10;i++)
		for (int j=i;j>=0;j--)
			v[i][j]=v[i-1][j-1]+v[i-1][j]*q;
	for (int i=1;i<10;i++)
		for (int j=i;j>=0;j--)
			v[i][j]+=v[i][j+1];
	freopen("cifre.out","w",stdout);
	printf("%.4lf\n",(double)(nr(b)-nr(a-1))/(b-a+1));
	return 0;
}