Cod sursa(job #767346)

Utilizator geniucosOncescu Costin geniucos Data 13 iulie 2012 12:41:09
Problema Cifre Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int p,l1,a1,b1,c,k,nr1,i,j,l,v[15],a[14][14];
void fac(int val)
{
	l=0;
	while(val>0)
	{
		l++;
		v[l]=val%10;
		val=val/10;
	}
	reverse(v+1,v+l+1);
}
int nr(int l,int v[12])
{
	int nr1=0;
	if(l==0) return 0;
	memset(a,0,sizeof(a));
	for(p=1;p<v[1];p++)
	{
		if(p==c) a[1][1]=1;
		else a[1][0]++;
	}
	if(v[1]==c) 
		nr1=1;
	for(i=2;i<=l;i++)
	{
		for(j=0;j<=i;j++)
		{
			if(j==nr1) 
			{
				a[i][j]=v[i];
				if(v[i]>=c) a[i][j]--;
			}
			if(j==nr1+1&&c<v[i]) 
				a[i][j]=1;
			for(p=0;p<=9;p++)
			{
				if(p==c&&j>0) a[i][j]=a[i][j]+a[i-1][j-1];
				else
				if(p!=c) a[i][j]=a[i][j]+a[i-1][j];
			}
		}
		if(v[i]==c) nr1++;
	}
	if(nr1>=k) nr1=1;
	for(j=k;j<=l;j++)
		nr1=nr1+a[l][j];
	//mai adun cate numere care au cel putin k cifre de c <10^(l-1)
	memset(a,0,sizeof(a));
	if(c!=0)
	{
		a[1][1]=1;
		a[1][0]=8;
	}
	else a[1][0]=9;
	for(i=2;i<l;i++)
	{
		a[i][0]=a[i-1][0]*9;
		for(j=1;j<=i;j++)
			a[i][j]=a[i-1][j]*9+a[i-1][j-1];
	}
	for(i=1;i<l;i++)
		for(j=k;j<=i;j++)
			nr1=nr1+a[i][j];
	return nr1;
}
int main()
{
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
scanf("%d %d %d %d",&a1,&b1,&c,&k);
if(k==0) printf("1.00000\n");
fac(b1);
l1=nr(l,v);
if(a1>0)
{
	fac(a1-1);
	l1=l1-nr(l,v);
}
else if(c==0) l1++;
printf("%d\n",l1);
printf("%.4lf\n",(double)l1/(b1-a1+1));
return 0;
}