Cod sursa(job #786950)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 12 septembrie 2012 13:51:15
Problema Cifre Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include<fstream>
#include<algorithm>
using namespace std;
int fact[10]={1,1,1,1,1,1,1,1,1,1};
int cifre_a[9]={0,0,0,0,0,0,0,0,0};
int cifre_b[9]={0,0,0,0,0,0,0,0,0};
ifstream f("cifre.in");
ofstream g("cifre.out");
void read_number(int& x)
{
	f>>x;
}
int factorial(int n)
{
	if(n==1)
	{
		fact[n]=1;
		return(1);
	}	
	else
	{
		fact[n]=n*factorial(n-1);
		return(fact[n]);
	}	
}	
int combinari(int n,int k)
{
	if(n==0)
		return(0);
	if(n!=k)
		return(fact[n]/(fact[k]*fact[n-k]));
	else
		return(1);
}
int digits(int x,int dig[])
{
	int i=0;
	if(x==0)
	{
		i=1;
		dig[0]=0;
	}	
	while(x!=0)
	{
		dig[i]=x%10;
		x=x/10;
		i++;
	}
	reverse(dig, dig+i);
	return(i);
}
//returns the number of pow10(m) numbers that have
//at least k digits of c
 
int favorables(int m,int k,int c)
{
	if(m!=0 && k!=0)
		return((int)pow((double)10,(double)(m-k))*combinari(m,k)-combinari(m,k)+1);
	if(m==0)
		return(0);
	if(k==0)
		return(1);
}	

int favorables2(int x, int m, int y, int n, int c, int k)
//returns the number of numbers from x*pow10(m) to y*pow10(n) that have
//at least k digits of c
{
	int favor=0;
	while(m<n)
	{
		if(x<=c)
			favor+=(10-x-1)*favorables(m-1,k,c)+favorables(m-1,k-1,c);
		else
			favor+=(10-x)*favorables(m-1,k,c);
		m++;
		x=1;
	}
	if(m==n)
	//it is supposed that y>x in case m==n from the start
	{
		if(c<y)
			favor+=favorables(n-1,k,c)*(y-x-1)+favorables(n-1,k-1,c);
		else
			favor+=favorables(n-1,k,c)*(y-x);
	}	
	return(favor);
}

int favorables1(int x,int m,int k,int c,int a)
{
	int rg,dig[10],nb_dig=digits(a,cifre_a),fav=0;
	for(rg=1;rg<nb_dig;rg++)
		fav+=favorables(cifre_a[m-rg-1],k,c)+favorables2(1,m,cifre_a[m-rg],m,c,k);
	return(fav);
}
int main()
{
	int a,b,c,k,x,y,z,nr_digits,nr_digits2;
	read_number(a);
	read_number(b);
	read_number(c);
	read_number(k);
	z=factorial(10);
	nr_digits=digits(a,cifre_a);
	if(a%(int)pow((double)10,(double)(nr_digits-1))==0)
		x=cifre_a[0];
	else
		if(cifre_a[0]==9)
		{
			x=1;
			nr_digits++;
		}
		else
			x=cifre_a[0]+1;
	nr_digits2=digits(b,cifre_b);
	if(b%(int)pow((double)10,(double)(nr_digits2-1))==0)
		y=cifre_b[0];
	else
		if(cifre_b[0]==1)
		{
			y=9;
			nr_digits2--;
		}
		else
			y=cifre_b[0]-1;
	g.precision(4);
	//g<<(favorables(nr_digits,k,c)-favorables(nr_digits-1,k,c))-favorables1(x,nr_digits,k,c,a)+favorables1(y,nr_digits2,k,c,a)+favorables2(x,nr_digits,y,nr_digits2,c,k)<<"/"<<(b-a)+1;
	g<<fixed<<(float)(favorables(nr_digits,k,c)-favorables(nr_digits-1,k,c))-favorables1(x,nr_digits,k,c,a)+favorables1(y,nr_digits2,k,c,a)+favorables2(x,nr_digits,y,nr_digits2,c,k)/(b-a+1);
}