Cod sursa(job #690232)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 25 februarie 2012 13:50:30
Problema Cifre Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
#include<math.h>
#include<string.h>

int a,b,cif,cif_val[20],nr_cif,apar;
char viz[20];
int pozitii[20],rez,sol;

int cifre(int val)
{
	int nrc = 0;
	
	if(!val)
		return 1;
	
	while(val)
	{
		val /= 10;
		nrc++;
	}
	
	return nrc;
}

void verificare(int val,int total)
{
	int i;
	
	//printf("////////////////////\n");
	//printf("%d %d\n", val,total);
	
	memset(viz,0,sizeof(viz));

	for(i = 1 ; i <= total ; i++)
		viz[pozitii[i]] = 1;
	
	for(i = nr_cif ; i >= 1 ; i--)
	{
		cif_val[i] = val % 10;
		val /= 10;
	}	
	
/*	for(i=1;i<=nr_cif;i++)
		printf("%d ",viz[i]);
	printf("\n");	
	
	for(i=1;i<=nr_cif;i++)
		printf("%d ",cif_val[i]);
	printf("\n");	*/
	
	int poz_libere = nr_cif - total;
	
	for(i = 1 ; i <= nr_cif ; i++)	
		if(!viz[i])
		{
			poz_libere--;
			
			if(cif_val[i]>cif)
				rez += (cif_val[i] - 1) * pow(9,poz_libere);
			else
				rez += cif_val[i] * pow(9,poz_libere);	
			
		//	printf("Adun %d\n",rez);			
						
			if(cif_val[i] == cif)
				break;
		}	
		else
		{
			if(cif < cif_val[i])
			{
				rez += pow(9,poz_libere);
				//printf("Adun %d\n",rez);
				
				break;
			}	
			else if(cif > cif_val[i])
				break;
		}
	if(i == nr_cif + 1)	
		rez++;
	//printf("////////////////////////////\n");	
}

void back_combinari(int poz,int ramase,int val,int total)
{
	if(poz == nr_cif + 1)
	{	
		if(ramase)
			return ;

		verificare(val,total);	

		return ;		
	}
	
	back_combinari(poz + 1,ramase,val,total);
	
	if(!ramase)
		return ;
	
	pozitii[ramase] = poz;
	back_combinari(poz + 1,ramase - 1,val,total);
	pozitii[ramase] = 0;
}

int below(int val,int nr)
{
	rez=0;

	back_combinari(1,nr,val,nr);
	
	return rez;
}

int number_with_fixed(int nr)
{
	return below(b,nr) - below(a-1,nr);
}

int main ()
{
	freopen("cifre.in","r",stdin);
	freopen("cifre.out","w",stdout);
	
	scanf("%d%d%d%d", &a, &b, &cif, &apar);
		
	nr_cif = cifre(b);

	for(int i = apar ; i <= nr_cif ; i++)
		sol += number_with_fixed(i);
		
	double dv=(double)sol/(b-a+1);	
		
	printf("%.4lf\n",dv);	
		
	return 0;	
}