Cod sursa(job #501037)

Utilizator ooctavTuchila Octavian ooctav Data 14 noiembrie 2010 10:15:34
Problema Cifre Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<cstdio>
#include<iostream>
using namespace std;

const int KMAX = 10;

int A, B, C, K, nr_cifre;
int cf[KMAX];
int REZ;

void citire()
{
	cin >> A >> B >> C >> K;
	int B2 = B;
	while(B2)
		nr_cifre++, B2 = B2 / 10;
}

int fa_numar(int A[])
{
	int rez = 0;
	for(int i = 1 ; i <= nr_cifre ; i++)
		rez = 10 * rez + A[i];
	return rez;
}

int p(int x)
{
	int nr1 = 0;
	while(x)
	{
		x /= 10;
		nr1++;
	}
	return nr1;
}

int put(int x, int pow)
{
	int rez = 1;
	while(pow)
	{
		rez *= x;
		pow--;
	}
	return rez;
}

bool bun()
{
	int X = fa_numar(cf);
	int nr = p(X);                                                                                                                                                                                        
	
	if(nr >= K && A <= X && X <= B)
		return 1;
	return 0;
}

int cifra(int x, int poz)
{
	return (x / put(10, p(x) - poz)) % put(10, poz - 1);
}

int numara()
{
	int Min[KMAX] = {0}, Max[KMAX] = {0};
	copy(cf + 1, cf + nr_cifre + 1, Min + 1);
	copy(cf + 1, cf + nr_cifre + 1, Max + 1);
	
	int nr_A = p(A);
	for(int i = 1 ; i <= nr_cifre ; i++)
		if(!cf[i])
			if(i > nr_cifre - nr_A)
				for(int k = 0 ; k <= 9 ; k++)
					if(k != C && k >= cifra(A, i - (nr_cifre - nr_A)))
					{
						Min[i] = k;
						break;
					}
			else
				Min[i] = 0;

	
	for(int i = 1 ; i <= nr_cifre ; i++)
		if(!cf[i])
			for(int k = 9 ; k ; k--)
				if(k != C && k <= cifra(B, i))
				{
					Max[i] = k;
					break;
				}
	
	int rez = 1;
	for(int i = 1 ; i <= p(fa_numar(Min)) ; i++)
		if(Min[i] < Max[i])
			if(Min[i] <= C && C <= Max[i])
				rez *= Max[i] - Min[i];
			else
				rez *= Max[i] - Min[i] + 1;
	
	return rez;
}

void back(int k)
{
	if(k == nr_cifre + 1)
	{
		if(bun())
			REZ += numara();
		return;
	}
	
	cf[k] = 0;
	back(k + 1);
	cf[k] = C;
	back(k + 1);
}

void scrie()
{
	printf("%.4lf\n", (double)REZ/(B - A + 1));
}

int main()
{
	freopen("cifre.in", "r", stdin);
	freopen("cifre.out", "w", stdout);
	citire();
	back(1);
	scrie();
	return 0;
}