Diferente pentru blog/editorial-runda8 intre reviziile #6 si #7

Nu exista diferente intre titluri.

Diferente intre continut:

*Toate numerele trebuie să aibă ca factori primi doar numere din mulţimea 2 , 3 , 5 , 7, deoarece acestea sunt singurele cifre care sunt numere prime.
*Având în vedere că numărul de cifre este limitat de $20$, puterea maxima a lui $2$ este limitată de $60$ (numărul format din 20 de cifre de 8), cea a lui $3$ de $40$ , iar cele ale lui $5$ si $7$ chiar de catre $20$.
Deci există maxim $60 * 40 * 20 * 20 = 960 000$ de produse posibile. Observaţi că această marigne superioară este o supraestimare destul de puternică, având în vedere că exponentul maxim nu poate fi atins de fiecare cifră în acelaşi timp.
Deci există maxim $60 * 40 * 20 * 20 = 960 000$ de produse posibile. Observaţi că această margine superioară este o supraestimare destul de puternică, având în vedere că exponentul maxim nu poate fi atins de fiecare cifră în acelaşi timp.
Astfel, am putea să variem exponentii pentru fiecare dintre cele 4 cifre prime şi apoi să hotărâm pentru fiecare configuraţie daca se poate obţine dintr-un număr cu lungime între $A$ şi $B$.
Astfel, am putea să variem exponentii pentru fiecare dintre cele 4 cifre prime şi apoi să hotărâm pentru fiecare configuraţie daca se poate obţine dintr-un număr cu lungime între $A$ şi $B$. Pentru a simplifica problema, observăm că dacă $Lmin$ ar fi numărul minim de cifre necesar pentru a obţine numărul $X$, atunci pentru orice lungime $L$ mai mare sau egală decât $Lmin$ există un număr de lungime $L$ care poate îl poate produce pe $X$. Adăugăm $L - Lmin$ 1-uri in coadă, pretty simple huh? Ş). Numărul $A$ devine astfel irelevant. Tot ce trebuie sa verificăm pentru un anumit număr $X$ este dacă $Lmin(X)$ este mai mic sau egal cu $B$.
 
Acest lucru se poate face printr-o abordare de tip greedy, ilustrată în fragmentul de cod de mai jos, extras din sursa lui Rareş, primul concurent care a rezolvat problema în timp de concurs.
 
==code(c)
int getNum(int x)
{
	int result = 0;
	if (x != 1) ++result;
	for (int c2 = 0; c2 <= 3 * x; ++c2)
		for (int c3 = 0; c3 <= 2 * x; ++c3)
			for (int c5 = 0; c5 <= x; ++c5)
				for (int c7 = 0; c7 <= x; ++c7)
				{
					int minneed = c5 + c7, addmin = 100000;
					for (int k = 0; k <= min(1, min(c2, c3)); ++k)
						addmin = min(addmin, k + (c2 - k) / 3 + (c3 - k) / 2 + ((c2 - k) % 3 != 0) + ((c3 - k) % 2 != 0));
					minneed += addmin;
 
					if (minneed <= x)
						++result;
				}
	return result;
}
==

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.