infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Dan-Leonard Crestez din Martie 08, 2004, 19:56:27



Titlul: 006 Factorial
Scris de: Dan-Leonard Crestez din Martie 08, 2004, 19:56:27
Aici puteţi discuta despre problema Factorial (http://infoarena.ro/problema/fact).


Titlul: 006 Factorial
Scris de: Munteanu Alexandru din Ianuarie 24, 2005, 15:30:41
am gasit formula la problema, insa imi ia doar 2 teste... mi-ati putea da un test mai cu susta sa imi dau seama unde pica?


Titlul: 006 Factorial
Scris de: Twister din Ianuarie 28, 2005, 11:45:35
Teoderescu Andrei a scris in articolul despre cautare binara:
Cod:

1) Sa se gaseasca (daca exista) cel mai mic n natural astfel incat n! sa se termine in exact p<=10^8 zerori.
....
In prima problema trebuie sa observam prima oara ca numarul de zerouri in care se termina n! creste odata cu n, observatie evidenta datorita definitiei lui n!. Atunci, putem cauta binar valoarea lui n pentru care se verifca relatia din enunt. Recomand problema "Factorial" din arhiva de probleme InfoArena celor interesati de implementarea algoritmului.


Si cum faci generezi pentru toate numerele de la 1 la 10^8, n! pentru care  are exact p cifre de 0 la sfarsit, pentru ca daca e asa tot nu poti sa trimiti o sursa de 1.66 Gb pe net

Nu stiu ce a vrut sa zica in articol...  :wink:


Titlul: 006 Factorial
Scris de: Cristian Strat din Ianuarie 28, 2005, 15:29:54
asa cum zice in enunt, trebuie sa gasesti n pentru care n! are p cifre de 0 la sfarsit.
evident, nu trebuie sa generezi "n!" ca sa afli cate 0-uri are.


Titlul: 006 Factorial
Scris de: Twister din Ianuarie 28, 2005, 16:12:51
Pai stai un pic, chiar daca nu generez n! si generez descompunerea de 2 si 5 ale lui n! cu un for, tot imi iese din timp la testele 5-20, iar daca vreau sa fac preprocesare nu pot sa trimit sursa din cauza dimensiunilor astronomice


Titlul: 006 Factorial
Scris de: Lepus Filip din Ianuarie 28, 2005, 16:26:42
eu am facut un program simplu, am dedus cateva lucruri.
Nu trebuie decat sa cautam 5-urile pentru ca oricum 2-uri vor fi "suficiente" pentru a forma 10.  
Tot imi iese din timp si am luat doar 30 d pcte.

Care este ideea cautarii binare in acest caz.


Titlul: 006 Factorial
Scris de: Cristian Strat din Ianuarie 28, 2005, 20:25:38
fie
f: N -> N, f(n) = numarul de 0-uri de la sfarsitul lui n!
f este o functie crescatoare (pe masura ca n-ul creste, numarul de 0-uri de la sfarsitul lui n! creste de asemenea)

"smenul" problemei este sa iti dai seama cum se calculeaza f(n). hint: vezi la ce putere apare 5 in descompunerea in factori primi a lui "n!".

cum f este o functie crescatoare, cautarea binara a lui n se aplica in urmatorul fel:
1. a = 0 si b = un numar suficient de mare
2. c = (a + b) / 2
3. daca f(c) < p  => cautarea se restrange in partea dreapta a intervalului [a, b]  (a = c + 1)
altfel cautarea se restrange in partea stanga (b = c - 1)
evident, daca f(c) = p inseamna ca numarul cautat este c
se repeta 2, 3

parcurgeti articolul despre cautare binara
http://info.devnet.ro/articole.php?page=art&art=29


Titlul: 006 Factorial
Scris de: Munteanu Alexandru din Februarie 16, 2005, 08:32:02
eu am determinat formula, dar totusi nu merge exact.. eu v-am cerut un test sa imi dau seama unde imi apare eroarea...


Titlul: 006 Factorial
Scris de: Moga Andrei din Februarie 16, 2005, 10:43:16
Si eu am rezolvat-o fara cautare binara si  primesc doar 90 de puncte.
Am retinut intr-un vector puterile lui 5 si intr-un altul nr. de zerouri corespunzator factorialului acestor puteri. Astfel 5! va avea un 0,25!.....6,125!......31 etc
Apoi am parcurs vectorul cu zerouri de la sfarsit spre 1 si  daca p>=zerouri adaugam la rezultat (p/zerouri )*putere si p devenea p%zerouri;
Rationamentul are si demonstratie matematica dar ia doar 90 de puncte!


Titlul: 006 Factorial
Scris de: Adrian Negreanu din Februarie 17, 2005, 08:19:59
Nu este necesara cautarea binara in aceasta problema. Se poate porni de la o aproximatie a lui N si se cauta din aproape in aproape. Daca aproximatia este buna atunci la valori mari ale lui lui P esti foarte aproape de rezultat. Iar la valori mici merge o cautare liniara deoarece se face un numar mic de pasi.


Titlul: 006 Factorial
Scris de: Paul Diac din Februarie 17, 2005, 13:15:22
Eu am rezolvat problema tot cu cautare binara, ideea e foarte simpla (si explicata foarte bine i n articol si mai sus). Daca tin minte bine, si eu luam 90 de puncte pentru ca nu aveam in vedere ca raspunsul poate fi "-1" (in cazul in care nu exista nici un numar n care sa aiba EXACT p zerouri la sfarsitul factorialului sau).
24! - are 4 zerouri
25! - are 6 zeroiri
Deci pentru p=5 raspunsul este "-1"  :wink:
Presupun ca asta e motivul pt care ai luat 90 de puncte.


Titlul: 006 Factorial
Scris de: Moga Andrei din Februarie 18, 2005, 10:35:59
Asta era problema...pe viitor trebuie sa fiu mai atent la descrierea problemei. Mersi de post.....altfel ma resemnam cu 90 de puncte :)


Titlul: 006 Factorial
Scris de: Munteanu Alexandru din Februarie 23, 2005, 22:39:08
pb e usoara invers, daca stii n sa afli cate zerouri p sunt.. invers, apare o pb... unele nr sunt 5^x ... astfel initial consider eu ca am pt p zerouri imi trebuie n=p*5.. insa deoarece in cazul acelor nr 5^x trebuie sa determin pana la N-ul care l-am aflat eu cate nr de forma 5^x au trecut si astfel sa adun pt N-ul determinat pt puterea x la care am ajuns (x-1)*x/2 zerouri la P..
Astfel pot realiza ori ca am gasit n mai mare ori n mai mic, si incerc sa iau valorile n-5 si n+5 sa vad daca imi da p zerouri(dupa cum am spus este formula cu ajutorul careia pot determina f usor pt n dat cate zerouri am: este ceva de genul: n%5+(x-1)*x/2 unde x este ultima putere la care ajunge cel mai mare 5^x care apartine intervalului (1,n)).. daca nu imi dau, inseamna ca  nu este solutie, daca imi dau, afisez variabila...  

Cu toata aceasta regula simpla, nu inteleg unde imi este greseala... imi ies doar 3 teste..


Titlul: 006 Factorial
Scris de: Twister din Martie 18, 2005, 00:30:22
Spuneti-mi si mie va rog frumos daca sunt corecte rezultatele:
N!         numarul de zerouri de la sfarsit
25                 6
125               31
625               156
3125             781
15625           3906
78125           19531
390625         97656
1953125       488281
9765625       2441406
48828125     12207031
244140625   61035156
1220703125 305175781

Multumesc anticipat pentru tot


Titlul: 006 Factorial
Scris de: Piros Lucian din Martie 18, 2005, 11:08:51
Citat din mesajul lui: malex
pb e usoara invers, daca stii n sa afli cate zerouri p sunt.. invers, apare o pb... unele nr sunt 5^x ... astfel initial consider eu ca am pt p zerouri imi trebuie n=p*5.. insa deoarece in cazul acelor nr 5^x trebuie sa determin pana la N-ul care l-am aflat eu cate nr de forma 5^x au trecut si astfel sa adun pt N-ul determinat pt puterea x la care am ajuns (x-1)*x/2 zerouri la P..
Astfel pot realiza ori ca am gasit n mai mare ori n mai mic, si incerc sa iau valorile n-5 si n+5 sa vad daca imi da p zerouri(dupa cum am spus este formula cu ajutorul careia pot determina f usor pt n dat cate zerouri am: este ceva de genul: n%5+(x-1)*x/2 unde x este ultima putere la care ajunge cel mai mare 5^x care apartine intervalului (1,n)).. daca nu imi dau, inseamna ca  nu este solutie, daca imi dau, afisez variabila...  

Cu toata aceasta regula simpla, nu inteleg unde imi este greseala... imi ies doar 3 teste..


Esti aproape de solutie ...mai trebuie sa verifici cate ceva. De exemplu pentru 125, tu obtii 125%5+(3-1)*3/2 = 125+2 = 127 care nu prea este corect. Gandeste-te de exemplu ca 50 o sa genereza 2 zerouri nu 1 cum te astepti tu (de exemplu 50*48=2400 deci mai ai inca 2 zerouri la rezulta.....la fel 75*72=5400...deci si aici ai 2 zerouri in plus la rezultat). Trebuie sa te uiti si cati multipli ai puterilor lui 5 ai pana la n ...... si problema ar trebui sa mearga.


Titlul: 006 Factorial
Scris de: Bogdan-Cristian Tataroiu din Martie 18, 2005, 11:21:47
Citat din mesajul lui: Twister
Spuneti-mi si mie va rog frumos daca sunt corecte rezultatele:
N!         numarul de zerouri de la sfarsit
25                 6
125               31
625               156
3125             781
15625           3906
78125           19531
390625         97656
1953125       488281
9765625       2441406
48828125     12207031
244140625   61035156
1220703125 305175781

Multumesc anticipat pentru tot

Sunt corecte toate...


Titlul: 006 Factorial
Scris de: Twister din Martie 18, 2005, 18:05:49
Multumesc mult


Titlul: 006 Factorial
Scris de: adsgasdgasgd din Martie 22, 2005, 20:01:13
P este puterea la care trebuie sa apara 5
intr-un n!.
Asta pentru ca intotdeauna vor fi mai putini
5 decat 2 intr-un n!.Iar ca sa formam
zerouri la final avem nevoie si de 5 si de 2
dar cum de 5 sunt mai putini atunci numarul lor
conteaza mai mult ceilalti 2 care raman,raman
in treaba lor pe dinafara...

deci:
_________________________________________________________
calcularea valorilor ce vor fi precalculate in programul
final:
iau fiecare multiplu de 5 de la 1 la...
si vad daca pm5 adica puterea lui 5 sumata
pana aici este mai mica decat P.
ma opresc daca este mai mare.
cand ies din loop adaug si puterea la care
se afla 5 in urmatorul sau multiplu si daca
am egalitate intre pm5 si P inseamna
ca exista n ai n! sa aiba P zerouri si
bag intr-un vector SEPOATE[P]=1
salvez intr-un vector ultimul multiplu de 5
verificat sa-i zicem M5[P],altfel
inseamna ca bag intr-un vector SEPOATE[P]=0.

asta fac pt primele P<1000 de nr sa zicem.
apoi fac asa:

pt orice P>=1000 primul P' din spate pentru care
SEPOATE[P']=1 pornesc de la ultimul sau multiplu
de 5 adica M5'=M5+5 pornesc de aici si incep iar sa adun
puteri la P' pana cand P' devine P,daca sare de P
iarasi inseamna ca am SEPOATE[P']=0.
si ar trebui sa mearga repede.
La sfarsit afisez P,M5,SEPOATE pe 3 linii diferite
cu toate numerele intre 1 si 99.999.999 cu step
5000 asta inseamna ca afisez intrarile vectorilor
cu indicele 1,5001,10001,...etc .
_________________________________________________________
folosesc valorile astea in felul urmator.
caut cel mai apropiat 5000*i+1<=P
(astfel incat diferenta min[P-(5000*i+1)] ).
de la acel numar pe care il gasesc aici va intreb
pe voi ce sa folosesc ? cautare binara, un while,?
oricum dupa ce am gasit i inseamna ca mai am de calculat
de facut de aici cel mult

O(5000*log   99999999)=O(5000*11,44)=O(57200) operatii
           5
ceea ce e foarte putin
dar vectorii M5,SEPOATE vor trebui stocati in
memorie ceea ce va duce la o incarcare a memoriei
cu O(M5)+O(SEPOATE)=
O([(4*99999999)/(5000*1024)]kb)+O(99999999/(5000*1024))
4 asta vine de la marimea unsigned longului
nouarii reprezinta intervalu mare pe care lucrez
5000 e stepul
1024 e nr de bytes dintr-un kb.
=O(99999999/(1024*10^3)) aprox O(98kb)

dar am mai trimis odata o sursa cu 100kb si nu mi-a mers
incarcata.

Nu consider ca e fair chestia asta cu limita de
marime pe sursa.
ati vazut foarte bine ca nu a fost nici un brute-force
nicaieri si cred ca algoritmul nu triseaza in rezolvarea
problemei,ca atare solicit mai mult spatiu de la voi
adminii de server.
macar la vreo 150k,n-o sa moara nimeni,nici macar hdd-urile
voastre.


Titlul: 006 Factorial
Scris de: VladS din Martie 22, 2005, 21:28:19
Vedeti ca gasiti pe mathworld cum se gaseste numarul de zerouri de la functia factorial. Parca s-a dat si la liis in runda 2.


Titlul: 006 Factorial
Scris de: Dima Alex din Martie 24, 2005, 00:49:11
Prima varianta pe care am trimis-o la pb asta a fost precomputare. in loc sa tii exact toate numerele, incearca sa tii din 10.000 in 10.000 si astfel stii cate zerouri sunt pana la un anumit nr si urmeaza doar sa verifici in cel mai rau caz pt urmatoarele 10.000, adica nu prea mult. Sursa avea si inca are 40.984 B si a luat doar 90 fiindca uitasem de '-1' :).

Dar daca citesti atent posturile de pe topicu asta iti dai seama ca folosind cautarea binara problema devine 'mai naturala'.


Titlul: despre problema
Scris de: adsgasdgasgd din Martie 24, 2005, 13:27:25
sursa mea a luat 5 puncte.
nu stiu de ce
lucrez cu unsigned longuri
si afisez si -1 cand e cazul
nu mai memorez numere precomputate
fac doar cautare binara si cu functie rapida
de aflare nr zerouri dintr-un factorial


Titlul: 006 Factorial
Scris de: la la ala din Martie 25, 2005, 08:51:34
=D> 1.          Nu stii sa faci cautare binara!
         2.          nr de zerouri a lui n factorial se calculeaza asa:
         nrz (nr de 0-uri)=n div 5+(n div 5 div 5)+......pana cand iti ajunge un termen la 0.

Nota: div iti returneaza catul impartirii.


Titlul: 006 Factorial
Scris de: Sima Mihai Cotizo -vechi din Martie 03, 2006, 09:49:25
Citat

fie
f: N -> N, f(n) = numarul de 0-uri de la sfarsitul lui n!
f este o functie crescatoare (pe masura ca n-ul creste, numarul de 0-uri de la sfarsitul lui n! creste de asemenea)

"smenul" problemei este sa iti dai seama cum se calculeaza f(n). hint: vezi la ce putere apare 5 in descompunerea in factori primi a lui "n!".

cum f este o functie crescatoare, cautarea binara a lui n se aplica in urmatorul fel:
1. a = 0 si b = un numar suficient de mare
2. c = (a + b) / 2
3. daca f(c) < p => cautarea se restrange in partea dreapta a intervalului [a, b] (a = c + 1)
altfel cautarea se restrange in partea stanga (b = c - 1)
evident, daca f(c) = p inseamna ca numarul cautat este c
se repeta 2, 3

parcurgeti articolul despre cautare binara


cat de mare sa fie b ala ??? intra in unsigned long long ??? ca asa am gandit si eu, dar cand am vazut dimensiunile m-am oprit...

[later edit]
am incercat cu unsigned long long si b = maximul cat intra si merge... doar ca iau 85 de puncte, gresesc testul 1,3 si 15... au ceva special? am verificat si cazul cand tre sa afisez -1...


Titlul: 006 Factorial
Scris de: Condrea Andrei din Martie 07, 2006, 17:17:47
pt TOTI..problema e super simpla....adik ai o cautare binara...pe acolo....doar nu vreti sa va zic rez...:D......da am o intrebare .....am o rezolvare impecabila....si iau doar 95 de puncte:D....nush de ce.....are ceva compilatoru....????//......solutia e buna is sigur de asta...:D :(


Titlul: 006 Factorial
Scris de: u-92 din Martie 07, 2006, 18:22:09
pierzi un caz particular


Titlul: 006 Factorial
Scris de: Bogdan-Alexandru Stoica din Martie 21, 2006, 10:56:30
nimic nu e sigur ...  :mrgreen:


Titlul: 006 Factorial
Scris de: Savin Tiberiu din Martie 21, 2006, 13:41:39
mist3rfi3ld, iti da WA sau TLE. dak iti da tle ar putea fi dak citeshti cu streamuri.


Titlul: 006 Factorial
Scris de: u-92 din Martie 21, 2006, 13:48:29
nici chiar  :) daca citesti multe date se simte diferenta, dar un intreg, doi.. nu se pune problema sa iei TLE din cauza asta


Titlul: 006 Factorial
Scris de: Gogu Marian din Martie 21, 2006, 13:50:57
Nu cred ca se poate sa iei TLE la problema asta daca citesti cu stream-uri. Merg ele mult mai incet decat o citire cu scanf dar asta se poate observa decat cand citesti mai mult de 10000 de numere.
Daca iei TLE aici poate ca ti se blocheaza programul cand nu exista solutie, de exemplu cand P=5.

Edit: Am postat aproape simultan cu u-92 si nu am observat ca am zis cam acelasi lucru.


Titlul: 006 Factorial
Scris de: Adrian Dobrescu din Martie 24, 2006, 09:09:56
Bai fratilor, ce are special testu' 1
La toate testele scot 0.1 s iar pe t1 imi da TLE???
E cumva vreunul la care trebuie afisat -1 sau ce are de da
un timp asa mare.


Titlul: Raspuns: 006 Factorial
Scris de: cnuteam din Aprilie 09, 2006, 11:58:55
 Am folosit un algoritm de scaderi repetate a lui p cu ajutorul unui vector. Merge doar pt 90 de puncte. Imi puteti spune daca aceste valori sunt bune.
10 000 000=40 000 010
99 999 999=400 000 010
24 165 865=96 663 485
23 750 754=95 003 040


Titlul: Raspuns: 006 Factorial
Scris de: ditzone din Aprilie 09, 2006, 12:49:33
Valorile obtinute de tine sunt bune...
Ai grija la teste de genul 11 trebuie afisat -1.. probabil tu afisezi 50, dar 50! are 12 de zero la sfarsit.


Titlul: Raspuns: 006 Factorial
Scris de: cnuteam din Aprilie 09, 2006, 13:48:09
   M-a ajutat mult exemplul pt. ca mi-am dat seama ca nu luam in considerare cateva cazuri particulare cu -1 ,pana la urma le-am depistat si-am luat 100 de puncte
 :yahoo:


Titlul: Raspuns: 006 Factorial
Scris de: Adrian Dobrescu din Aprilie 16, 2006, 18:47:31
Am depistat si eu gresheala. Era un caz particular, care insa nu da -1


Titlul: Raspuns: 006 Factorial
Scris de: belphegor din Iunie 03, 2006, 19:59:49
:-s ....aceeasi problema . iau 95 de pcte ... la testu` unu wrong answer ... si nu ma prind care e cazul ..inca :rambo: daca ati da un hint ar fi genial ..


Titlul: Raspuns: 006 Factorial
Scris de: Andrei Grigorean din Iunie 03, 2006, 23:27:21
afisezi vreodata 0? scrie in enunt ca trebuie sa fie strict pozitiv ce afisezi.


Titlul: Raspuns: 006 Factorial
Scris de: belphegor din Iunie 03, 2006, 23:37:33
[in enunt scrie daca nu exista n! care sa aiba p zerouri la sfarsit se afiseaza -1 . pt p = 0 afisez 0 . ]

mi`am dat seama ce am gresit 8-| . phew.multam mult :)



Titlul: Raspuns: 006 Factorial
Scris de: Iacob Eduard din Octombrie 16, 2006, 23:45:21
Cine ma poate ajuta si pe mine putin?Deci am reusit sa implementez algoritmul in Borland C++,dar cand sa trimit solutia imi da eroare ca nu pot sa caut binar din cauza limitelor prea mari(initial i=1,j= 10 miliarde).daca as da sa caute pt limitele i=1 j=1 miliard imi merge,dar la trei teste imi da raspuns gresit,iau doar 85 de puncte,si e mai mult ca sigur ca raspunsul depaseste limita de 1 miliard(de ex pt p=305175781 ,n este egal cu 1220703125),si sunt sigur ca am pus si conditia aia cu -1.In Borland imi merge am testat eu si imi da raspunsuri corecte.
Si de unde as putea sa iau si eu Gnu C++,sa nu mai am pe viitor asemenea probleme?La fel si la problema FRACTII,am reusit sa o rezolv pana la urma,mi se incadreaza in timp ,imi da si raspunsuri corecte,dar cand sa trimit solutia imi trimite tot eroare de genul acesta.MULTUMESC


Titlul: Raspuns: 006 Factorial
Scris de: Andrei Grigorean din Octombrie 17, 2006, 13:06:01
din ce am inteles eu, tu cauti doar intre 1 si 1 miliard?

daca e asa, iar programul e corect, poti linistit sa pui 10 miliarde si sa schimbi din long in long long, si cu toate ca nu iti va compila in borland, va merge pe gcc.

spor!


Titlul: Raspuns: 006 Factorial
Scris de: ditzone din Octombrie 17, 2006, 20:00:46
Si vezi sa faci afisarea si citirea cu %lld daca faci C ....


Titlul: Raspuns: 006 Factorial
Scris de: Iacob Eduard din Octombrie 18, 2006, 00:08:08
Eu fac cautare binara intre 1 si 1 miliard.Dar tocmai invers e,in borland imi merge,in gnu nu imi merge.imi da eroarea urmatoare:
integer constant is too large for \"long\" type,dar sunt sigur ca toate variabilele sunt de tipul long long. :-k.Asta cand in loc de 1 miliard pun 10 miliarde.


Titlul: Raspuns: 006 Factorial
Scris de: ditzone din Octombrie 18, 2006, 07:43:14
Pai pune 10000000000LL, ca sa ii zici ca e o constanta de tip long long...


Titlul: Raspuns: 006 Factorial
Scris de: Iacob Eduard din Octombrie 18, 2006, 10:45:01
Multumesc,am reusit sa remediez situatia,nu stiam treaba asta.Mai am de invatat... :)
Mai am un raspuns incorect la testul 1,am sa vad de ce.
Inca odata multumesc. :peacefingers:
[Later Edit]:Gata,am luat 100 de puncte,am depistat greseala.Miam adus aminte ca numarul trebuie sa fie strict pozitiv,iar in cazul in care p=0,atunci n este 1.Scrie asta si in exemplele problemei,acolo unde se da si textul. \:D/


Titlul: Raspuns: 006 Factorial
Scris de: rrr-jr din Noiembrie 19, 2006, 15:43:39
 :x iau 95 de puncte ... imi da un raspuns gresit la testul 3 ... :| ...


Titlul: Raspuns: 006 Factorial
Scris de: Mierla Laurentiu Marian din Noiembrie 20, 2006, 19:30:27
Ai grija la cazurile particulare, sa afisezi "-1" atunci cand trebuie si verifica limitele vectorilor :thumbup:


Titlul: Raspuns: 006 Factorial
Scris de: BYSorynyos din Decembrie 21, 2006, 08:10:28
Saluatare !

Eu am rez problema cu ,etoda cautarii rapide !
Merge perfect dar nu iau dacat 90 pct ??
Ce caz am pierdut pe drum ?
Stie cineva ??


Titlul: Raspuns: 006 Factorial
Scris de: Mircea Dima din Decembrie 22, 2006, 13:14:20
Saluatare !

Eu am rez problema cu ,etoda cautarii rapide !
Merge perfect dar nu iau dacat 90 pct ??
Ce caz am pierdut pe drum ?
Stie cineva ??

printf -1 in caz ca nu exista?


Titlul: Raspuns: 006 Factorial
Scris de: HighScore din Ianuarie 18, 2007, 15:32:35
salz! am rezolvat prob si iau doar 95 de puncte  :angry: si chiar nu pot sa imi dau seama de ce nu merge testu 15
Citat
Rulez testul 1: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 2: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 3: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 4: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 5: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 6: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 7: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 8: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 9: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 10: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 11: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 12: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 13: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 14: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 15: ok: timp 0ms: mem 8kb: Raspuns incorect: 0 puncte
Rulez testul 16: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 17: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 18: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 19: ok: timp 0ms: mem 8kb: Corect!: 5 puncte
Rulez testul 20: ok: timp 0ms: mem 8kb: Corect!: 5 puncte


nevermind, fixed it :yahoo:


Titlul: Raspuns: 006 Factorial
Scris de: Silaghi Raul din Ianuarie 22, 2007, 06:46:00
Ma puteti ajuta si pe mine la problema factorial va rog. Primesc doar 25 de puncte si acasa orice test as face este bun.
In problema am adoptat ceva simplu :
Cod:
for(i=5;div<=P;i+=5){
nr=i;
while(nr%5==0) {div++;nr=nr/5;}
si afisez div-5.

Va rog ajutatima!!!!!!! ](*,)  :thumbdown:


Titlul: Raspuns: 006 Factorial
Scris de: Andrei Grigorean din Ianuarie 22, 2007, 11:09:49
Probabil ca iei Time Limit Excedeed. Asta se intampla deoarce algoritmul folosit de tine nu este destul de bun. Incearca sa citesti celelalte posturi de pe forum pentru idei de rezolvare.


Titlul: Raspuns: 006 Factorial
Scris de: Ionescu Vlad din Ianuarie 27, 2007, 19:43:47
Salut!
Daca mi-ati putea da si mie un indiciu in legatura cu ce as putea gresi...
Iau 90 de puncte, picand testele 3 si 15. Verific cand p = 1 sau cand nu exista un n! cu exact p zerouri la sfarsit si afisez -1... dar totusi pe acele 2 teste primesc raspuns gresit, si sincer nu stiu ce ar putea fi :/

Folosesc cautarea binara.


Titlul: Raspuns: 006 Factorial
Scris de: HighScore din Ianuarie 27, 2007, 22:52:09
si eu am avut o prob de genu asta din cate imi aduc aminte la 15 era un test de genu 60 sau 311, in mod normal ar trebui sa afiseze -1?


Titlul: Raspuns: 006 Factorial
Scris de: Ionescu Vlad din Ianuarie 28, 2007, 10:00:20
Atat pentru 60 cat si pentru 311, programul meu afiseaza -1...

Edit: am luat 100... cand afisam -1 afisam cu %lld, trebuia cu %d  :)


Titlul: Raspuns: 006 Factorial
Scris de: Silaghi Raul din Februarie 05, 2007, 11:10:30
ce ar putea fi la astea doua tete k nu-mi da  :-s
Test Timp executie Memorie folosita Mesaj Punctaj
1      0ms              8kb                  Corect! 5
2      0ms              8kb                  Corect! 5
3      559ms           156kb               Time limit exceeded. 0
4      0ms              8kb                  Corect! 5
5      0ms              8kb                  Corect! 5
6      0ms              8kb                  Corect! 5
7      0ms              8kb                  Corect! 5 
8      0ms              8kb                  Corect! 5
9      0ms              8kb                  Corect! 5
10    0ms              8kb                  Corect! 5
11    0ms              8kb                  Corect! 5
12    0ms              8kb                  Corect! 5
13    0ms              8kb                  Corect! 5
14    0ms              8kb                  Corect! 5
15    559ms          156kb                Time limit exceeded. 0
16    0ms              8kb                  Corect! 5
17    0ms              8kb                  Corect! 5
18    1ms              8kb                  Corect! 5 
19    0ms              8kb                  Corect! 5
20    0ms              8kb                   Corect! 5
Punctaj total: 90

 
folosesc si eu cautarea binara    .. . .. PLEASE HELP  :thumbdown:


Titlul: Raspuns: 006 Factorial
Scris de: Savin Tiberiu din Februarie 05, 2007, 11:38:00
vezi dak ai tratat cazul in care nu ai solutie. E posibil ca programu tau sa cicleze pe un astfel de caz.


Titlul: Raspuns: 006 Factorial
Scris de: Silaghi Raul din Februarie 05, 2007, 12:11:59
 :-'   si sa zicem k nu ii asta problema ce altceva ar putea fi???  :-s


Titlul: Raspuns: 006 Factorial
Scris de: Adrian Diaconu din Februarie 05, 2007, 12:22:50
Poate nu faci bine cautarea binara... se poate intampla sa cicleze daca nu ai grija la cazul cand intervalul in care ai ajuns sa cauti are lungime 2...


Titlul: Raspuns: 006 Factorial
Scris de: Silaghi Raul din Februarie 05, 2007, 12:33:06
care ar trebui sa fie intervalul de cautare??? 0 - 50000000 ajunge??? :-s


Titlul: Raspuns: 006 Factorial
Scris de: Savin Tiberiu din Februarie 05, 2007, 12:38:35
greseala ta in cu o probabilitate de 90% este acolo unde a zis adi diaconu, dak intervalul tau de cautare ar fi prea mic nu ar justifica TLE-u. Intervalul il poti lua de la 1 la 1 << 31.


Titlul: Raspuns: 006 Factorial
Scris de: Paul-Dan Baltescu din Februarie 05, 2007, 12:44:42
Da, ce spui tu e prea mic. Mai adauga un 0. Justificare: Stii ca P<=10^8 si stii ca apare cel putin un 0 terminal din 5 in 5 numere, deci 5*10^8 e suficient.
Nu te sfatuiesc sa iei intervalul pana 2^31 pentru ca poti depasi valoarea maxima acceptata in int (long / longint) facand adunari sau alte operatii.


Titlul: Raspuns: 006 Factorial
Scris de: Savin Tiberiu din Februarie 05, 2007, 12:48:24
 :-' yep my mistake, oricum cu unsigned long int nu cred ca ar fi problem.


Titlul: Raspuns: 006 Factorial
Scris de: Silaghi Raul din Februarie 05, 2007, 12:54:34
Tot  nu imi merge  ](*,)
CE ar trebui sa fac???? am un cod de 90 puncte  :readthis: si nu pot lua inca 10 puncte???


Titlul: Raspuns: 006 Factorial
Scris de: Adrian Diaconu din Februarie 05, 2007, 13:28:44
Nu era vorba de intervalul initial in care cauti ci de intervalele la care restrangi cautarea.
Sa zicem ca ai ajuns sa cauti in intervalul [a,a+1]. Fixezi m = (a+a+1)/2=a. Si observi ca vei avea solutie in intervalul [m,a+1] deci continui cautarea aici, dar acesta este indentic cu [a,a+1]. De aici iti cicleaza la infinit.


Titlul: Răspuns: 006 Factorial
Scris de: Suciu Adrian din Martie 01, 2007, 21:10:21
Imi spune cineva care este greseala in implementarea cautarii binare aici ? (imi da numai 55 de puncte)

Cod:

// nrz este numarul de zerouri al lui c
// st , dr , sunt limitele cautarii
// p reprezinta numarul de intrare
st=0;
dr=1000000000;
n=1;
if(p>0){
while(n){  c=(st+dr)/2;
              nrz=numarzerouri(c);
              if(nrz==p&&st==dr) {n=st;break;}
              if(dr<st) {n=-1;break;}
          if(p>nrz) st=c+1;
      else dr=c-1;                           
           }
}


Pana la urma am rezolvat problema cu un if care verifica inca odata la sfarsit stanga si dreapta dar sunt curios care e greseala .. help pliiiz :D


Titlul: Răspuns: 006 Factorial
Scris de: Trimbitas Viorel Stefan din Martie 07, 2007, 08:42:40
problema e simpla ... 12 while-uri una dupa alta si ai rezolvat problema, la toate testele in 0 ms.


Titlul: Răspuns: 006 Factorial
Scris de: Savin Tiberiu din Martie 07, 2007, 09:47:31
Citat
problema e simpla ... 12 while-uri una dupa alta si ai rezolvat problema, la toate testele in 0 ms
:-o ce 12 whileuri?? ce faci cu ele??


Titlul: Răspuns: 006 Factorial
Scris de: Adrian Vladu din Martie 07, 2007, 10:10:09
Citat
problema e simpla ... 12 while-uri una dupa alta si ai rezolvat problema, la toate testele in 0 ms

S-a nascut un nou Ciucu  :)


Titlul: Răspuns: 006 Factorial
Scris de: Sima Cotizo din Martie 08, 2007, 09:53:32
 :D daca nu ma insel 5^12 e maximul care furnizeaza un P pana in 10^8 ...

On topic, am refacut problema, dar pic si eu testul 1... care nu trebuie sa dea -1 (verificat cu sursa care dadea doar -1 si am primit WA)... am verificat si la afisare daca N>0 afisez N altfel afisez -1 ... ce altceva poate fi ?   :annoyed:


Titlul: Răspuns: Raspuns: 006 Factorial
Scris de: Andrei Grigorean din Martie 08, 2007, 14:43:48
afisezi vreodata 0? scrie in enunt ca trebuie sa fie strict pozitiv ce afisezi.

Ia uite ca uneori are rost sa te citezi pe tine insuti :P.

Incercati si voi sa cititi posturile anterioare cand aveti o nelamurire. Nu are rost sa discutam acelasi lucru in mod repetat :).


Titlul: Răspuns: 006 Factorial
Scris de: Sima Cotizo din Martie 08, 2007, 18:36:12
Hai sa ma citez si eu pe mine:
am verificat si la afisare daca N>0 afisez N altfel afisez -1 ... ce altceva poate fi ?   :annoyed:

Deci verific sa afisez mereu pozitiv, intrebarea era unde altundeva poate fi greseala? si da, stiu ca s-au mai discutat, de la 85 puncte pana la 95 am mai "rafinat" solutia pe baza observatiilor voastre anterioare ... totusi nu ma prind, (cred ca) respect toate conditiile... :?


Titlul: Răspuns: 006 Factorial
Scris de: Airinei Adrian din Martie 08, 2007, 19:09:11
Poate fi P = 0 pe testul ala, tu sa faci cautarea binara in intervalul [0, INF] sa iti gaseasca N = 0 solutia si tu sa afisezi -1 cand defapt trebuia 1 :)


Titlul: Răspuns: 006 Factorial
Scris de: Sima Cotizo din Martie 08, 2007, 20:19:00
 :shock: :shock: :shock: faceam cautarea de la 0, dar tratam separat cazul pt P=0... acum mi-a dat :)

Multumesc mult!  :ok:

PS: Andrei, iarta-ma ca am postat si eu un citat din ce am zis, dar mentionasem ca verificam chestia aia si citisem tot threadul inainte... totusi greseam ceva minor...


Titlul: Răspuns: 006 Factorial
Scris de: Trimbitas Viorel Stefan din Martie 22, 2007, 20:19:47
Citat
problema e simpla ... 12 while-uri una dupa alta si ai rezolvat problema, la toate testele in 0 ms
:-o ce 12 whileuri?? ce faci cu ele??

scaderi


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Aprilie 03, 2007, 15:50:11
super tare...!!! eu sunt ink o persoana kre ia 90 de puncte din cauza unor cazuri particulare.. #-o..mai lucrez putin la ea, sper sa le depistez.... :weightlift: :-'



[later edit] aku iau 95 de puncte :rotfl:o fi vreun caz nasol??? :rotfl: (iau WA pe testul 5)


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Aprilie 03, 2007, 16:34:03
Stie kareva ce are testul 5 de nu-mi iese?? [ps:poate a mai avut probleme cineva ku testul 5] 10x anticipat :)


Titlul: Răspuns: 006 Factorial
Scris de: Pandia Gheorghe din Aprilie 03, 2007, 16:47:23
Eu iau 65p cu raspuns gresit pe celelalte cazuri... nu imi pot da seama ce gresesc, poate formula de cautat numar de zerouri desi nu cred. Am lasat-o asa pana la urma, ca nu-mi dau seama.

Am folosit urmatoarea functie. Daca e interzis sa o postez va rog sa o stergeti:
Cod:
long nrz( long c )
{
     long p = 0;
     while( c )
     {
            p += c/5;
            c /= 5;
     }
     return p;
}


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Aprilie 04, 2007, 16:21:27
care'i smecheria la testu 1???? iau 95 de pct.. si nu imi dau seama c gresesc acolo :|


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Aprilie 04, 2007, 18:05:05
pt bluedrop_demon: Nu sunt sigur..dar vezi k s-ar putea sa nu afisezi cel MAI MIC NUMAR POSBIL...eu de aia luam 65 punte. Dupa ce ai gasit nr trebuie sa afisezi CEL MAI MARE NUMAR care se divide cu 5, mai mic decat nr pe care l-ai gasit...sper sa te ajute...


Titlul: Răspuns: 006 Factorial
Scris de: Pandia Gheorghe din Aprilie 04, 2007, 19:16:33
Nu verificam acest lucru intr-adevar, dar si dupa ce l-am verificat iau tot 65p  :sad:
Imi puteti spune totusi daca functia pe care o folosesc eu e corecta ?


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Aprilie 04, 2007, 21:25:02
As spune k e corecta...din moment ce iti ia 65 de puncte....dar probabil gresesti la vreun caz particular care tinde spre general...( :-')..nu am folosit functia ta...si nu prea o inteleg..poate dak as sti ce e cu variabilele alea si pt ce o folosesti...poti sa-mi trimiti un mesaj privat..cred k te pot ajuta...dar si eu am o problema: ce are testul 5?...as avea nevoie de o sugestie...dak exista cineva care s-a confruntat cu aceeasi problema.. :fighting:


Titlul: Răspuns: 006 Factorial
Scris de: Pandia Gheorghe din Aprilie 04, 2007, 21:33:40
Functia o folosesc ca sa aflu numarul de zerouri de la sfarsitul lui n!. Ti-am trimis mesaj privat "florian". Multumesc mult pt ajutor!


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Aprilie 04, 2007, 22:55:30
functia e buna.. pe aia o folosesc si eu .. si iau 100 p


Titlul: Răspuns: 006 Factorial
Scris de: Pandia Gheorghe din Aprilie 04, 2007, 23:44:12
Facusem o greseala de incepator... nush ce ma apucase. Oricum am luat si eu 100p  :peacefingers:


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Aprilie 07, 2007, 12:44:47
In sfarsit am luat si eu 100 :yahoo: Faceam o greseala mica si neobservabila!!! :P


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Aprilie 18, 2007, 16:17:55
care era gresala?


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Aprilie 18, 2007, 17:01:17
Pai...knd gaseam un numar n kare respecta cerintza, afisam cel mai mare numar mai mic decat n, care se divide cu 5. Era o greseala de implementare...adik..dak "n" ar fi fost divizibil cu 5, afisam n-5, in loc de n...aici era greseala... :) si trebuie sa iei in considerare si cazul in care p=0.  :-'


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Aprilie 18, 2007, 17:23:06
a fost o problema interesanta :) eu mi'am batut putin capu' pana mi'am dat seama ca afisez 0 in loc de 1 la primul test :P


Titlul: Răspuns: 006 Factorial
Scris de: Bogdan Popescu din Mai 19, 2007, 12:46:34
Imi place foarte mult articolul pus de voi la cautarea binara
http://info.devnet.ro/articole.php?page=art&art=29
NU E NIMIC ACOLO


Titlul: Răspuns: 006 Factorial
Scris de: Codrea Marcel din Mai 19, 2007, 12:52:33
Link-ul a fost pus inainte de trecerea la noul format, este un link infoarena1 !

http://infoarena.ro/Aplicatii-ale-cautarii-binare

Aici gasesti articolul . Oricum exista o sectiune cu articole ! Cauta acolo !   :thumbdown:


Titlul: Răspuns: 006 Factorial
Scris de: Bogdan Popescu din Mai 19, 2007, 13:44:26
Link-ul a fost pus inainte de trecerea la noul format, este un link infoarena1 !

http://infoarena.ro/Aplicatii-ale-cautarii-binare

Aici gasesti articolul . Oricum exista o sectiune cu articole ! Cauta acolo !   :thumbdown:
In articol scrie foarte putin ca nu imi dau seama ce trebuie facut!!Cine ma ajuta?


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Mai 19, 2007, 14:10:03
Ok! Te ajut eu. Vrei sa stii algoritmul cautarii binare?


Titlul: Răspuns: 006 Factorial
Scris de: Bogdan Popescu din Mai 19, 2007, 14:16:43
Da...si daca poti sa imi dai id-ul tau de mess al meu este bogdanpopescu88


Titlul: Răspuns: 006 Factorial
Scris de: Bogdan Popescu din Mai 19, 2007, 14:18:34
Algoritmul il stiu dar cum fac problema?


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Mai 19, 2007, 14:26:49
Pai, tot pe acest topic era explicata ideea: fixezi doua pozitii ( ex: i=1; j=MAXLONG) si cauti binar intre i si j, la fiecare pas calculand puterea la care apare m in descompunerea lui 5, unde m=(i+j)/2 ; Cand gasesti, afisezi m-ul, iar dak la un moment dat i>j nu exista solutie.  :thumbup: Succes!


Titlul: Răspuns: 006 Factorial
Scris de: Radulea Adrian din Iulie 11, 2007, 14:54:13
imi poate spune si mie cineva ce e mai deosebit la testele 3 si 15, iau TLE ](*,)
Multumesc anticipat.


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Iulie 11, 2007, 14:57:25
imi poate spune si mie cineva ce e mai deosebit la testele 3 si 15, iau TLE ](*,)
Multumesc anticipat.

Pai spune-ne cum ai facut...Ca o prima idee, vezi poate iti intra in ciclu infinit...nu prea exista cazuri particulare... :-'


Titlul: Răspuns: 006 Factorial
Scris de: Radulea Adrian din Iulie 11, 2007, 15:22:26
Am facut cautare binara. La celelalte teste e ok, la 3 si la 15 imi da tle...


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Iulie 11, 2007, 15:48:55
Vezi poate nu folosesti o metoda optima pt a afla la ce putere apare x in descompunerea lui n! . Altceva nu prea exista.


Titlul: Răspuns: 006 Factorial
Scris de: Ionescu Vlad din Iulie 11, 2007, 16:09:06
Mai poate sa iti cicleze cautarea binara. Daca faci cautare binara in intervalul [a, b], si ai ceva de genu while ( a <= b ), a poate sa nu-l depaseasca niciodata pe b pe unele cazuri, si atunci iti va cicla. Poti rezolva asta ori punand un break daca se intampla asta, ori avand grija la cum modifici valorile a si b astfel incat sa nu se intample chestia asta...


Titlul: Răspuns: 006 Factorial
Scris de: Radulea Adrian din Iulie 11, 2007, 16:21:08
Am descoperit problema, la aceste teste trebuie afisat -1 si cautarea nu se opreste , de aia iau tle...


Titlul: Răspuns: 006 Factorial
Scris de: HighScore din Iulie 11, 2007, 16:35:42
o cautare binara scrisa ca la carte nu ar trebuii sa cicleze nici macar atunci cand nu are solutie. Deci in consecinta ai cam 2 variante:
1) iei un algoritm de cautare binara de pe net scris frumos si citet sa il intelegi (asta ar cam trebui sa mearga)
2) gasesti solutia fara cautare binara (care desi e cam idioata, e mai rapida(log5n))


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Iulie 11, 2007, 16:42:04
3. Sau ai grija sa te opresti la timp knd gasesti solutia, si sa iei in considerare cazul in care nu exista solutie.
4. Sa fii atent la orele de info, knd se preda cautarea binara.. :-'


Titlul: Răspuns: 006 Factorial
Scris de: Radulea Adrian din Iulie 11, 2007, 16:50:46
10x pentru sfaturi, am reusit in sfarsit sa iau 100 p  :yahoo: :P Intradevar, cautarea cicla, dar s-a rezolvat.


Titlul: Răspuns: 006 Factorial
Scris de: Simionescu Andrei din Septembrie 13, 2007, 17:08:20
hmm am facut o sursa care foloseste cautarea binara(exact ca cea recomandata anterior), si primesc rezultate ca:
2   ->   10
10  ->  46
17  -> -1 :>
52   ->   218
114  -> 469
256 -> 1034
45001 -> 180016

any idea? :?  :fool:


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Homorodean din Septembrie 13, 2007, 17:43:15
2 -> 10
10 -> 45
17 -> -1
114 -> 465
256 -> 1030
45001 -> 180015

Eu zic sa iei teste mai mici, si sa calculezi de mana rezultatul corect. Cu un watch sau niste printf-uri ar trebui sa-ti dai seama unde gresesti.


Titlul: Răspuns: 006 Factorial
Scris de: Simionescu Andrei din Septembrie 13, 2007, 21:21:04
stiu ca nu merge, vroiam sa stiu motivele probabile; cum ziceam, am folosit metoda clasica, cu functia care determina nr de zerouri si cautare binara. functia merge, n`are treaba, si nici cautarea binara nu pare sa fie gresita; merci oricum de raspuns, dar asteptam idei. testez in continuare, poate ma prind

@peanutz: j, btw, problema era k uitasem sa iau cel mai mic numar care indeplineste conditia, lucru` usor de observat, de altfel, din testele corecte postate de tine; in fine, nevermind :-j  :roll:


Titlul: Răspuns: 006 Factorial
Scris de: Bondane Cosmin din Septembrie 13, 2007, 21:23:21
stiu ca nu merge, vroiam sa stiu motivele probabile; cum ziceam, am folosit metoda clasica, cu functia care determina nr de zerouri si cautare binara. functia merge, n`are treaba, si nici cautarea binara nu pare sa fie gresita; merci oricum de raspuns, dar asteptam idei. testez in continuare, poate ma prind

Cred ca gasesti ceva idei in pag anterioare.  :wink:


Titlul: Răspuns: 006 Factorial
Scris de: Simionescu Andrei din Septembrie 13, 2007, 21:30:10
thanks a lot, dude... greseala mea c`am postat. oricum rezolvam pana la urma :bored:
edit: limita superioara de la cautarea binara era la mine 10^8 in loc de 10^10


Titlul: Răspuns: 006 Factorial
Scris de: MciprianM din Octombrie 28, 2007, 16:35:34
o cautare binara scrisa ca la carte nu ar trebuii sa cicleze nici macar atunci cand nu are solutie. Deci in consecinta ai cam 2 variante:
1) iei un algoritm de cautare binara de pe net scris frumos si citet sa il intelegi (asta ar cam trebui sa mearga)
2) gasesti solutia fara cautare binara (care desi e cam idioata, e mai rapida(log5n))

cum e cu baza 5?
eu mam gandit ceva cu log2m*log5n cu m=cu n pentru p=108


Titlul: Răspuns: 006 Factorial
Scris de: cojocaru aurelian din Noiembrie 01, 2007, 17:28:07
 stie cineva ce are testu 5?....fac cautare binara intre 1 si 4*10^8]...iau wa... si nu pierd cazurile cu
cu -1 cand nu exista...


Titlul: Răspuns: 006 Factorial
Scris de: Bondane Cosmin din Noiembrie 01, 2007, 17:40:37
Legat de teste oficiale, nu stiu ce poate avea testul 5 deosebit.

Vezi ca sunt mai sus ceva exemple, poate gasesti buba. Spre exemplu eu fac cautare binara pana la :Dr = 10000000000LL, cred ca ii 10^10  :)


Titlul: Răspuns: 006 Factorial
Scris de: cojocaru aurelian din Noiembrie 01, 2007, 18:08:44
...daca avem un x=4*10^8 atunci x! va avea peste 10^8 zerouri si in enunt 0 ≤ P ≤ 10^8
care intra in long nu?...s-ar putea sa gresesc ...?
 


Titlul: Răspuns: 006 Factorial
Scris de: Bogdan-Alexandru Stoica din Noiembrie 01, 2007, 20:54:24
si eu tot intre 1 si 4*10^8 am cautat. poate nu il gasesti pe cel mai mic. numarul cautat este intotdeauna divizibil cu 5. poate aici pierzi testul 5...  :-s

L.E. : fie P = 0 e caz special :P


Titlul: Răspuns: 006 Factorial
Scris de: Tirca Bogdan din Ianuarie 12, 2008, 15:55:05
Cum pot sa aflu la ce teste nu iau puncte?Si de ce e neaaparata nevoie de cautare binara?Eu zic ca folosesc un algoritm destul de simplu si rapid.. :?


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Ianuarie 12, 2008, 16:03:08
Pai... dai click exact acolo unde iti scris numarul punctelor in monitorul de evaluare. Spune`ne si noua ce algoritm folosesti.
ps: nu a zis nimeni ca e obligatorie cautarea binara.

de ex: pe ultima ta sursa trimisa ai http://infoarena.ro/job_detail/122478 .


Titlul: Răspuns: 006 Factorial
Scris de: Tirca Bogdan din Ianuarie 12, 2008, 19:21:51
imi da eroarea asta--" Killed by signal 8(SIGFPE" de la test 4 la 15. Ce inseamna?


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Ianuarie 12, 2008, 19:26:34
Pai..probabil folosesti vreun vector, care nu e declarat suficient de mare, sau  poate ca depasesti memoria. Spune-ne ideea, si poate te ajutam mai mult.  :) Apropo, incearca sa citesti si documentatia de pe site.  :ok:


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Grigorean din Ianuarie 12, 2008, 19:31:14
http://infoarena.ro/documentatie/evaluator

@Florian: e signal 8, nu 11.


Titlul: Răspuns: 006 Factorial
Scris de: Tirca Bogdan din Ianuarie 13, 2008, 00:06:48
Nu folosesc nici un vector in program.


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Ianuarie 13, 2008, 11:25:55
@Florian: e signal 8, nu 11.

Da..am gresit. Sorry.

Nu folosesc nici un vector in program.

Vezi poate ai impartiri la 0.


Titlul: Răspuns: 006 Factorial
Scris de: Tirca Bogdan din Ianuarie 14, 2008, 19:42:51
Nici impartiri la 0 nu fac :'(


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Grigorean din Ianuarie 14, 2008, 19:49:24
Da-ti teste si vezi unde crapa.


Titlul: Răspuns: 006 Factorial
Scris de: hulparu adrian din Februarie 20, 2008, 08:14:59
In fiecare zi inveti ceva nou...  :winner1:... cu hinturile de pe acest topic am reusit sa iua 100


Titlul: Răspuns: 006 Factorial
Scris de: Zozo Zozo din Martie 11, 2008, 18:32:48
Spuneti-mi si mie va rog frumos daca sunt corecte rezultatele:
N!         numarul de zerouri de la sfarsit
25                 6
125               31
625               156
3125             781
15625           3906
78125           19531
390625         97656
1953125       488281
9765625       2441406
48828125     12207031
244140625   61035156
1220703125 305175781

Multumesc anticipat pentru tot



Nu este adevarat!Ai unele erori in valorile date...de exemplu pentru 31 de zerouri trebuie ca N sa fie 135.


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Martie 11, 2008, 18:36:45
E bine 125. 135 are 33 de 0'uri la sfarsit.


Titlul: Răspuns: 006 Factorial
Scris de: Canta Andrei din Martie 18, 2008, 22:13:44
Imi puteti spune ce gresesc depaseste timpul de executie
Cod:
var nr,z,p,i:longint;
    f:text;
begin
  assign(f,'fact.in');reset(f);
  read(f,p);
  assign(f,'fact.out');rewrite(f);
  z:=0;i:=0;
  while z < p do
    begin
      inc(i,5);
      nr := i;
      while nr mod 5 = 0 do
        begin
          inc(z);
          nr := nr div 5;
        end;
    end;
  if z>p then
    writeln(f,-1)
  else if p = 0 then
    writeln(f,1)
  else
    writeln(f,i);
  close(f);
end.
Am incercat si cautare binara dar acolo la fiecare c (centru, mijloc) face descompunerea. Iar la mine face doar odata.
Ce am gresit ? :sad:


Titlul: Răspuns: 006 Factorial
Scris de: razyelx din Martie 21, 2008, 00:44:25
as dori sa imi comfirmati daca sunt bune urmatoarele deduceri

!n       cifre de zero

125     31
150     38
175     44
200     51


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Martie 21, 2008, 01:09:10
Nu prea sunt corecte. Uite rezultatele:
125 - 31
155 - 38
180 - 44
210 - 51


Titlul: Răspuns: 006 Factorial
Scris de: razyelx din Mai 03, 2008, 09:15:35
numa sa imi spuneti si mie preprocesare sau nu?


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Misarca din Mai 03, 2008, 09:29:27
Intra lejer si fara preprocesare


Titlul: Răspuns: 006 Factorial
Scris de: Catalin Francu din Mai 27, 2008, 22:01:12
1/5 + 1/25 + 1/125 + 1/625 + ... converge la 1/4  :D


Titlul: Răspuns: 006 Factorial
Scris de: Neagu Rares Florian din August 09, 2008, 13:18:14
deci.... am o problema... am facut binary search si am optimizat tot ce puteam, dar la 2 teste imi da tle (time limit execeded) ... am incercat sa schimb dr cu alata valoare decat 2000000000, dar in rest IMI DA MAI PUTIN  :fighting:  :angry: ... ajutor cineva ?


Multumesc anticipat


Titlul: Răspuns: 006 Factorial
Scris de: E1 La5c01 din August 11, 2008, 22:09:58
uita-te in pag 3 a topic-ului la primele 3 mesaje.. la fel ca si tine pierdea testele 3 si 15 ;).. succes :)


Titlul: Răspuns: 006 Factorial
Scris de: Tirca Bogdan din Noiembrie 08, 2008, 23:55:01
Deci am si eu o problema.Am facut problema cu un soi de cautare binara,merge pentru testele din exemplu si totusi iau 0 puncte.Any idea?Crek fac ceva ce nu e permis in gnu dar totusi nu da eroare...


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Misarca din Noiembrie 09, 2008, 00:21:20
Incearca si alte teste, nu numai pentru cele din exemplu. Uite cateva
Nu prea sunt corecte. Uite rezultatele:
125 - 31
155 - 38
180 - 44
210 - 51


Titlul: Răspuns: 006 Factorial
Scris de: Tirca Bogdan din Noiembrie 09, 2008, 00:25:33
si pentru astea merge :|


Titlul: Răspuns: 006 Factorial
Scris de: Cerneanu Cristian din Noiembrie 11, 2008, 19:42:52
cum de creat o lista a numerelor prime in turbo pascal?

mersi anticipat


Titlul: Răspuns: 006 Factorial
Scris de: Manea Constantin din Noiembrie 15, 2008, 23:56:12
Parerea mea este ca x trebuie neaparat sa fie divizibil cu 5... :-' Programul meu imi iese, dar nu merge compilatorul :sad:, sau ce este pe site de da note la programe :-k... Problema ia destul de putin :)... sper sa vad si eu cat am gresit :?...


Titlul: Răspuns: 006 Factorial
Scris de: Chibici Tiberiu din Ianuarie 08, 2009, 22:21:40
Salutare
Imi merge programul, dar nu si atunci cand nu gaseste nici un numar care sa indeplineasca conditiile: timp depasit. De asemenea compilatorul imi zice ca raspunsul e gresit dintr-un motiv necunoscut. Unde am gresit? :-k
Cod:
#include<iostream.h>
#include<fstream.h>

ifstream in("fact.in");
ofstream out("fact.out");

int main()
{
int p,ok=0,n,twos=0,fives=0,pp;
in>>p;

for(n=1;ok==0 && n>0;n++)
{
pp=n;
while(pp%5==0 || pp%2==0){
if (pp%2==0) { twos++; pp=pp/2;}
if (pp%5==0) { fives++; pp=pp/5;}
}

if(twos>=p && fives>=p) ok=n;
}

if(ok==0) out<<-1;
else out<<ok;

out.close();
in.close();

return 0;
}


Titlul: Răspuns: 006 Factorial
Scris de: Pripoae Teodor Anton din Ianuarie 08, 2009, 22:32:39
@Tiberiu

Sursa ta este ineficienta. Citeste cele 6 pagini ale topicului si vei vedea ca se rezolva cu cautare binara. Si acel test cu raspuns gresit il iei pentru ca nu afisezi -1 cand nu exista N cu proprietatea ceruta, tu afisezi -1 cand ok e 0, nefiind niciodata 0.

Uite codul aici:

Cod:

#include<iostream.h>
#include<fstream.h>

ifstream in("fact.in");
ofstream out("fact.out");

int main()
{
int p,ok=0,n,twos=0,fives=0,pp;
in>>p;

for(n=1;ok==0 && n>0;n++)
{
pp=n;
while(pp%5==0){
if (pp%5==0) { fives++; pp=pp/5;}
}

if(fives>=p)
ok=n;
}

if(fives != p) out<<-1;
else out<<ok;

out.close();
in.close();

return 0;
}



http://infoarena.ro/job_detail/240954

 (http://infoarena.ro/job_detail/240954)

Vezi ca nu trebuie sa tii cont si de 2-uri, ele vor fi intotdeauna mai multe decat cinciuri. Astfel, timpul se reduce destul de mult, si prinzi inca 2 teste. Gandeste-te la solutia cu cautare binara.

Spor :)


Titlul: Răspuns: 006 Factorial
Scris de: Adrian Toncean din Ianuarie 28, 2009, 21:12:03
Propun o abordare fara cautare binara
Pentru P zerouri ne trebuiesc in N! sa apara 5 de P ori.
Intalnim un 5 la fiecare 5 numere, apoi intalnim un 5 in plus la fiecare 25 de numere, inca unu in plus la fiecare 125 de numere... si asa mai departe pana la 5^13 = 1220703125.
Plecand de la aceasta idee putem spune ca
P zerouri se gasesc in primele (P - (P div 5) - (P div 25) - (P div 125) - ... - (P div 5^13))*5 numere.
Rationamentul, zic eu, este corect, dar pe alocuri nu returneaza ce ar trebui.
Mi-a placut mai mult ideea aceasta deoarece algoritmul este minim...

EX: pentru P = 2 avem P * 5 = 10
               P = 7         (P - 1) * 5 = 30

Ma poate corecta cineva?


Titlul: Răspuns: 006 Factorial
Scris de: Vlad Schnakovszki din Ianuarie 30, 2009, 23:43:35
Nu stiu de unde ai scos 5^13, dar am presupus ca ai dreptate. Mi-ar placea totusi sa stiu de unde l-ai scos.

Ideea ta in mare e buna, dar faci greseala fatala sa confunzi p cu n.
Exemplu:
Pentru p=5, algoritmul tau va da 20, dar raspunsul corect este 25.
Pentru p=31, algoritmul tau va da 115, dar raspunsul corect este 125.
Ideea e ca tu numeri cate numere sunt divizile cu n^k pana la numarul respectiv, cand tu defapt ar trebui sa numeri de cate ori apare numarul 5 pana la numarul respectiv.
5 in ecuatia ta va trebui inlocuit cu 6, 25 cu 31 si asa mai departe, conform urmatorului algoritm:
Cod:
#include <stdio.h>
#include <conio.h>
unsigned long t, s, i, n;
int main(void)
{
s=0;
scanf("%uld", &n);
for (i=1;i<=n/5;i++)
{
   s++;
   if (i%5==0)
    {
      t=i;
      while (t%5==0)
      {
         s++;
         t/=5;
         }
      }
   }
printf("%ld", s);
getch();
return 0;
}

Inlocuind toate acestea iti va da urmatoarea formula:
p=p-p/6-p/31-p/156-p/781-p/3906-p/19531-p/97656-p/488281-p/2441406-p/12207031-p/61035156-p/305175781;
n=5*p;
Problema e ca am reusit sa iau doar 20 puncte cu ea, restul Wrong Answer.
Asta e forma la care am ajuns. Sper ca observa cineva ce am gresit ca la ora asta nu se prea mai invart rotitele.
Cod:
#include <stdio.h>
long long p, t;
int main(void)
{
freopen("fact.in", "r", stdin);
freopen("fact.out", "w", stdout);
scanf("%lld", &p);
if (p==0)
printf("1");
else
{
t=p+1;
p=p-p/6-p/31-p/156-p/781-p/3906-p/19531-p/97656-p/488281-p/2441406-p/12207031-p/61035156-p/305175781;
t=t-t/6-t/31-t/156-t/781-t/3906-t/19531-t/97656-t/488281-t/2441406-t/12207031-t/61035156-t/305175781;
if (t==p)
printf("-1");    
else
printf("%lld", p*5);
}
fcloseall();
return 0;
}

Iar pentru varianta cu cautarea binara ... Poate spune cineva in detaliu ce caut cu el ? Ca pe forum am gasit numa bucati care nu se prea leaga. (P.S.: Nu imi explicati algoritmul ca il stiu, ci cum se implementeaza pentru problema asta ca nu reusesc sa-mi dau seama. Mersi.)


Titlul: Răspuns: 006 Factorial
Scris de: Branescu Adrian din Februarie 03, 2009, 19:36:18
Nu stiu de unde ai scos 5^13, dar am presupus ca ai dreptate. Mi-ar placea totusi sa stiu de unde l-ai scos.

Ideea ta in mare e buna, dar faci greseala fatala sa confunzi p cu n.
Exemplu:
Pentru p=5, algoritmul tau va da 20, dar raspunsul corect este 25.
Pentru p=31, algoritmul tau va da 115, dar raspunsul corect este 125.
Ideea e ca tu numeri cate numere sunt divizile cu n^k pana la numarul respectiv, cand tu defapt ar trebui sa numeri de cate ori apare numarul 5 pana la numarul respectiv.
5 in ecuatia ta va trebui inlocuit cu 6, 25 cu 31 si asa mai departe, conform urmatorului algoritm:
mdea... exista calculator si in windows ce are pana la 12 cifre sau depinde.. chiar mai multe.. cat despre idee este foarte buna, atat doar ca are nevoie doar de puteri ale lui 5 pana la 5^10 si probabil conditiile in caz ca p=5^x, unde x ia valori de la 1 la 10, nu le-a pus bine (prezinta cazuri particulare fata de formula lui) :) In rest cred ca este bine si chiar in acest moment ma chinuiam sa-l fac sa mearga  ](*,)


Titlul: Răspuns: 006 Factorial
Scris de: Adrian Toncean din Februarie 03, 2009, 22:25:07
Ideea parea foarte ok... daca intreaga problema putea fi restransa la o formula era exceptional... dar nu este, mi-am dat seama dupa mult trial and error ce si cum.
5^13 este ultima putere a lui 5 care incape intr-un integer (4 byte int)
MACAR ca aproximatie bunicica ar putea fi folosita formula... am facut teste si greseste pentru numere mari undeva cam cu 8-9%, deci de la aproximatie spre numar se poate apela la un algoritm simplu de adunari repetate (sau fie... si cautare binara)


Titlul: Răspuns: 006 Factorial
Scris de: Branescu Adrian din Februarie 04, 2009, 00:14:18
Ideea parea foarte ok... daca intreaga problema putea fi restransa la o formula era exceptional... dar nu este, mi-am dat seama dupa mult trial and error ce si cum.
5^13 este ultima putere a lui 5 care incape intr-un integer (4 byte int)
MACAR ca aproximatie bunicica ar putea fi folosita formula... am facut teste si greseste pentru numere mari undeva cam cu 8-9%, deci de la aproximatie spre numar se poate apela la un algoritm simplu de adunari repetate (sau fie... si cautare binara)
Pai imbunatatind metoda ta intr-un fel am reusit sa iau 10 puncte, iar cu alogrimul meu intial (ce foloseste o alta metoda) am obtinut 25 de puncte... sincer nu imi dau seama din ce cauza, deoarece cel care foloseste formula e mult mai eficient, insa la unele teste imi da Raspuns Incorect. 
 
Cod:
var i,p:longint;    a:array[1..100000000] of longint;
    f:text;
begin
assign (f,'fact.in');
reset (f);
readln (f,p);
close (f);
if p=0 then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,1);
close(f);
end
else
begin
if p<=5 then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,p*5);
close (f);
end
else
begin
a[1]:=5;
for i:=2 to (p div 5) do
begin
a[i]:=a[i-1]+6;
end;
dec(i);
if p=a[i] then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,(p-(i-2)-((p*5) div (25*i)))*5);
close (f);
end
else
if p<a[i] then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,(p+(i-1)-((p*5) div (25*(i-1))))*5);
close (f);
end
else
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,(p-(i-1)-((p*5) div (25*i)))*5);
close (f);
end;
end;
end;
end.

e in stare cam bruta, stiu.. dar am incercat atatea variante, sa obtin un algoritm mai optim decat cel de 25 de puncte, incat mi`a pierit orice chef sa imi mai scurtcircuitez creierii  :)

 Editat de moderator: Era mai simplu si mai elegant sa folosesti tag-ul [ code ], in loc de:  
Citat
[ color=green ][ b ][ b ][ b ][ shadow=red,left ]



Titlul: Răspuns: 006 Factorial
Scris de: Paul-Dan Baltescu din Februarie 04, 2009, 00:27:36
Nu m-am uitat pe codul tau, desi presupun ca nu este pe ideea corecta. In schimb, mi-a sarit in ochi faptul ca declari 400 Mb (4 * 100 000 000, vectorul a). Iata una din greselile tale.

In plus, ar fi o idee buna sa va dezvatati sa mai postati codul tuturor problemelor care nu va ies. Nu e treaba comunitatii sa va depaneze sursele. O alternativa mai buna ar fi sa va ganditi de mai multe ori inainte sa incepeti sa codati si apoi sa incercati sa va gasiti greselile singuri.


Titlul: Răspuns: Răspuns: 006 Factorial
Scris de: Vlad Schnakovszki din Februarie 04, 2009, 13:45:16
Nu m-am uitat pe codul tau, desi presupun ca nu este pe ideea corecta. In schimb, mi-a sarit in ochi faptul ca declari 400 Mb (4 * 100 000 000, vectorul a). Iata una din greselile tale.

In plus, ar fi o idee buna sa va dezvatati sa mai postati codul tuturor problemelor care nu va ies. Nu e treaba comunitatii sa va depaneze sursele. O alternativa mai buna ar fi sa va ganditi de mai multe ori inainte sa incepeti sa codati si apoi sa incercati sa va gasiti greselile singuri.

Am stat 4 ore si tot am cautat de ce nu merge. Dupa 4 ore am ajuns la concluzia ca ori o las balta ori va intreb si pe voi. Am preferat a doua solutie. E ceva rau in asta?


Titlul: Răspuns: 006 Factorial
Scris de: bla blah din Februarie 14, 2009, 15:36:45
Aflam 0-urile prin impartirea la 5.(deoarece numarul de 0-uri=numarul de perechi 2*5)
Normal,am putea sa ii spunem sa imparta si la 2,si la 5,dar doar am complica,deoarece tot timpul 5 va fi la putere mai mica.

Sunt sigur ca rezultatul a fost trimis de foarte mult timp,dar poate trece cineva pe aici sa-mi spune daca am gandit bine.(si da,mi-e lene sa citesc 100+ comentarii).


Titlul: Răspuns: 006 Factorial
Scris de: Savin Tiberiu din Februarie 14, 2009, 18:29:13
Citat
(si da,mi-e lene sa citesc 100+ comentarii).
Si mie imi e lene sa iti raspund. Baga o sursa si vezi daca merge sau nu.


Titlul: Răspuns: 006 Factorial
Scris de: Davide din Martie 10, 2009, 20:23:16
De cand 10! are mai putin de 2 cifre? Exemplul e gresit. 10! = 24320. Nu trebuie sa aiba mai mult de 2 cifre.

Ce sa zic... am uitat sa includ fisierele text...

[editat de moderator] foloseste butonul "modifica", nu mai posta consecutiv (e a doua oara in seara asta cand iti zic, nu?)


Titlul: Răspuns: 006 Factorial
Scris de: Sima Cotizo din Martie 10, 2009, 20:35:07
10!=3628800. De atunci are 2 cifre de 0 la sfarsit...


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Grigorean din Martie 10, 2009, 22:33:19
@Davide: Ti-as sugera sa iti revizuiesti tonul din comentarii. In primul rand pentru ca vorbesti prostii, si in al doilea rand pentru ca ar fi spre binele tau daca iti doresti sa fii ajutat.


Titlul: Răspuns: 006 Factorial
Scris de: Branescu Adrian din Martie 24, 2009, 22:03:51
Cod:
var a,b,stop,c,e,n,p:int64;
function f(c:int64):int64;
var fact:int64;
begin
fact:=1;
e:=0;
while c div fact<>0 do
begin
fact:=fact*5;
if c div fact=0 then
break;
e:=e+c div fact;
end;
f:=e;
end;
begin
assign (input,'fact.in');
reset (input);
read (input,p);
close (input);
if p=0 then
begin
assign (output,'fact.out');
rewrite (output);
write (output,1);
close (output);
halt;
end
else
if p<=4 then
begin
assign (output,'fact.out');
rewrite (output);
write (output,p*5);
close (output);
halt;
end;
a:=0; b:=p*5; stop:=0;
while a<=b do
begin
c:=(a+b-5) div 2;
if f(c)<p then
a:=c+1
else
if f(c)>p then
b:=c-1
else
begin
stop:=p; a:=b+1;
end;
end;
assign (output,'fact.out');
rewrite (output);
if stop<>0 then
if c mod 10=5 then
write (output,c)
else write (output,c-(c mod 10 - 5))
else
write (output,-1);
close (output);
end.
...Ma poate ajuta cineva cu vreun caz special, indicatie, orice pliz :) Chiar nu pot sa-mi dau seama de ce iau doar 55 de puncte  :-s raman dator...


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Jiplea din Martie 25, 2009, 08:01:22
Stie cineva ce-i cu testul 2?Nu iau mai mult de 95 de puncte din cauza lui.Am tratat caz particular pentru cand p este 0 sa afiseze 1 iar cautarea mi se opreste fie cand ok ia valoarea true(cand a gasit rezultatul) fie cand nu mai e valabila relatia a<c<b (a,b-capetele c-mijlocul)
http://infoarena.ro/job_detail/287713


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Martie 25, 2009, 11:15:10
Cand gasesti C-ul, probabil tu il afisezi direct, insa trebuie afisat cel mai mare multiplu al lui 5, mai mic decat C.


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Jiplea din Martie 25, 2009, 15:41:28
c-ul nu ia valori decât pe multiplii lui 5.Eu când calculez C-ul folosesc formulele:
C=(A+B)/2;
C-=C%5;


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Martie 25, 2009, 17:02:06
Relatia asta nu e buna: a<c<b. Ar trebui sa fie a<=c<=b.


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Jiplea din Martie 25, 2009, 20:42:15
Bine-ar fi fost să fie aia problema..Tot 95  :readthis: .Secvența pentru căutarea binară e asta:
 
Cod:
a=1;  
 b=5*p; 
 c=(a+b)/2; 
 c=c-c%5; 
 while(a<=c&&c<=b&&a<=b&&!ok) 
  { 
  fn=get(c); //get(c) returneaza zerourile pe care le are la sfarsit c! 
  if(fn==p) 
   { 
   ok=true; 
   i=c; 
   } 
  else if(fn<p) 
   a=c+1; 
  else 
   b=c-1; 
  c=(a+b)/2; 
  c=c-c%5; 
  } 


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Martie 25, 2009, 22:28:20
Fa cautarea in intervalul [0, MAXINT]. Banuiesc ca afisezi -1, daca la sfarsit ok ramane false... Si la conditia din while, e suficient sa pui while(a<=b && !ok).


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Jiplea din Martie 26, 2009, 08:12:24
În sfârșit :wink: .Nu trebuia să folosesc numai divizorii lui 5.La final numai trebuia să afișez i-i%5 ca să mă asigur.Thx


Titlul: Test
Scris de: Rosca Valentin din Aprilie 01, 2009, 16:54:56
Pai fa-ti tu un test corect si incearca-l :readthis:


Titlul: Răspuns
Scris de: Rosca Valentin din Aprilie 01, 2009, 16:58:29
folositi __int64 :D


Titlul: Răspuns: 006 Factorial
Scris de: Rosca Valentin din Aprilie 01, 2009, 17:04:59
puteti sa-mi dati un test va rog :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok:


Titlul: Răspuns: 006 Factorial
Scris de: Dragos Oprica din Aprilie 01, 2009, 17:12:59
puteti sa-mi dati un test va rog :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok:

testele oficiale nu se fac publice, dar incearca sa faci un program brut cu care sati generezi propriile teste si sigur vei gasi greseala (daca exista una)


Titlul: Răspuns: 006 Factorial
Scris de: Rosca Valentin din Aprilie 08, 2009, 20:36:53
Pai nici nu-mi trebuie.
Am gasit formula: n/5^1+n/5^2+.....+n/5^i
unde 5^i<=n
5^i=5 la puterea i
dar timpul de executie e prost.


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Aprilie 08, 2009, 21:30:22
Timpul de executie e ok . :D Nu cred ca ai fost prea atent la cerinta . Tu ai gasit acolo o functie pe care o poti folosi pentru a afla numarul de zerouri al lui N ! , insa ti se cere N minim pentru care N! are exact P zerouri, deci pe undeva exact invers :). Poti totusi folosi functia asta la ceva :P Daca nu iese , citeste tot topic-ul .


Titlul: Răspuns: 006 Factorial
Scris de: Rosca Valentin din Aprilie 09, 2009, 13:40:12
Citat din mesajul lui klamathix:
Citat
Timpul de executie e ok . Very Happy Nu cred ca ai fost prea atent la cerinta . Tu ai gasit acolo o functie pe care o poti folosi pentru a afla numarul de zerouri al lui N ! , insa ti se cere N minim pentru care N! are exact P zerouri, deci pe undeva exact invers Smile. Poti totusi folosi functia asta la ceva Tongue Daca nu iese , citeste tot topic-ul .
Pai nu am folosit nici o functie
ci am folosit formula asta pentru a afla nr de 0 a lui n! n=n+1
dar eu am pus n=n+5 si nu-mi iese
dar stiu ca asta este formula
P.S. eu am facut asta pana cand nr de zerouri = p. ](*,)  ](*,)
Ai inteles!!!!! :indifferent:


Titlul: Răspuns: 006 Factorial
Scris de: Dragos Oprica din Aprilie 09, 2009, 14:16:54
Citat din mesajul lui klamathix:
Citat
Timpul de executie e ok . Very Happy Nu cred ca ai fost prea atent la cerinta . Tu ai gasit acolo o functie pe care o poti folosi pentru a afla numarul de zerouri al lui N ! , insa ti se cere N minim pentru care N! are exact P zerouri, deci pe undeva exact invers Smile. Poti totusi folosi functia asta la ceva Tongue Daca nu iese , citeste tot topic-ul .
Pai nu am folosit nici o functie
ci am folosit formula asta pentru a afla nr de 0 a lui n! n=n+1
dar eu am pus n=n+5 si nu-mi iese
dar stiu ca asta este formula
P.S. eu am facut asta pana cand nr de zerouri = p. ](*,)  ](*,)
Ai inteles!!!!! :indifferent:

Ideea de baza este ca rezolvarea ta este ineficienta in raport cu timpul de executie

Iti sugerez sa citesti tot topicul pentru ca vei gasi informatii valoroase despre rezolvare.


Titlul: Răspuns: 006 Factorial
Scris de: Rosca Valentin din Aprilie 09, 2009, 14:25:47
Si unde gasesc topicul? :x
[editat de moderator]exces de emoticoane


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Aprilie 09, 2009, 14:28:47
Tocmai postezi in el...


Titlul: Răspuns: 006 Factorial
Scris de: Sima Cotizo din Aprilie 09, 2009, 14:32:33
:ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok: :ok:
???  ???  ???  ???  ???  ???  ???  ???  ???  ???  ???
 :readthis: :readthis: :readthis:

In plus, nu mai face exces de smilies. Nu te ajuta nici in rezolvare, nici sa gasesti un utilizator care sa iti explice calm.


Titlul: Răspuns: 006 Factorial
Scris de: Rosca Valentin din Aprilie 09, 2009, 14:36:47
Pai am gasit alta solutie
Cod:
#include<math.h>
#include<fstream.h>
ifstream fin("fact.in");
ofstream fout("fact.out");
long p,n,i,j,x;
int main()
{
fin>>p;
if(p)
{
n=9;
do
{
n++;
x=0;
for(i=5;i<=n;i=i+5)
{
ci=i;
while(ci%5==0)
{
x=x+ci/5;
ci=ci/5;
}
}
}
while(x<p);
if(x>p)
fout<<"-1";
else
fout<<n;
}
else
fout<<"1";
return 0;
}

dar imi iese doar 10 pt

[editat] mai lasa smilieurile.

Acum, imi explica si mie cineva cum sa gasesc solutia,va rog.
Adresa mea de mail este [email protected]

[editat] nu mai posta consecutiv, foloseste butonul "modifica"


Titlul: Răspuns: 006 Factorial
Scris de: razyelx din Aprilie 09, 2009, 17:54:09
pe pagina 4, respectiv 5 vei afla ca trebuie sa folosesti cautare binara in intervalul [1 .. MAX]. In cautarea binara vei introduce formula de calculat zero-uri.


Titlul: Răspuns: 006 Factorial
Scris de: Andrici Cezar din Mai 12, 2009, 16:55:23
am facut problema de 40 ... restu TLE  :angry: puteti sa imi ziceti si mie o metoda usoara de a afla cate numere de 0 are la sfarsit? :(( 
Cod:
int nrz(long x)//x numarul caruia ii fac x!
    {
    nr0=0;//numarul de 0 de la sfarsit
    tmp=x;//auxiliar lui x
    while (tmp>0)
          {
          nr0+=tmp/5;
          tmp/=5;
          }
    return nr0;
    }

Deci aveti idei? Va rog sa imi ziceti  :) am incercat sa optimizez dar nu pot
P.s am citit tot forumu si nu am inteles ideea cu cautarea binara:((


Titlul: Răspuns: 006 Factorial
Scris de: Andrici Cezar din Mai 15, 2009, 17:50:52
am reusit sa fac cu cautare binara dar pentru 10 mie imi zice 47 :d de ce?


Titlul: Răspuns: 006 Factorial
Scris de: Andrici Cezar din Mai 15, 2009, 17:56:19
scuzati uitasem ca trebuie cel mai mic.... ce a patit evaluatorul?


Titlul: Răspuns: 006 Factorial
Scris de: Porcescu Alexandru din Iulie 02, 2009, 14:23:21
stau de 3 zile la problema  asta si iau TLE la toate testele  :fighting: ](*,) ](*,) ](*,)
http://infoarena.ro/job_detail/328571?action=view-source
imi spune si mie cineva vreo optimizare..............?Please... :'( :'(


Titlul: Răspuns: 006 Factorial
Scris de: Florian Marcu din Iulie 02, 2009, 16:53:52
Cum ai rezolvat ?


Titlul: Răspuns: 006 Factorial
Scris de: Tabara Mihai din Iulie 03, 2009, 12:58:45
imi spune si mie cineva vreo optimizare..............?Please... :'( :'(
Poate te ajuta postul lui wickedman (http://infoarena.ro/utilizator/wickedman) de aici (http://infoarena.ro/forum/index.php?topic=32.0).

 :thumbup:


Titlul: Răspuns: 006 Factorial
Scris de: Gagos Radu Vasile din Iulie 13, 2009, 16:38:50
Am si eu nevoie de putin ajutor, am facut problema din prima cu cautare binara si pun 1 cand p=0, si -1 in cazuri precum p=192 (193=>775), 786 (787=>3150), 966 (968=>3875), dar s-ar putea totusi sa gresesc la cazuri gen 625+125=750, p=187 dar nu stiu care e p-ul imediat de sub el, mie pentru p=182 imi da 735, p=183 da 740, p=184 da 745 iar pentru p=185 si 186 da -1. Nu sunt prea sigur de rezultatele postate, in afara de cele cu -1. Daca sunt totusi corecte atunci nu stiu ce gresesc.  Dupa ce am vazut ca nu o mai scot din 85 de puncte dupa tot felul de chichite am citit tot forumul si am verificat pentru toate setele de date puse, imi dau toate corect, am verificat si singur pe testele mele cu tot felul de sume care sa se lege si imi dadea corect, desi am unele dubii. Testele care nu-mi ies sunt 5, 6 si 14 si oricat de mult incerc sa-mi dau seama cat de adanc trebuie sa patrund pentru a avea un -1 nepus de fiecare data testele imi spulbera aluziile. Daca puteti sa-mi spune-ti ce va da pentru p=182, 183, 184, 185, 186 si 187 sau mici idicii la ce nu-mi dau seama m-ati ajuta mult, nu ma las pana nu rezolv asta, e o problema usoara, dar cu multe chichite...


Titlul: Răspuns: 006 Factorial
Scris de: Dragos-Alin Rotaru din Iulie 13, 2009, 21:13:39
Incearca sa faci  cautarea binara astfel incat sa iti dea -1 atunci cand nu gaseste nici un rezultat. Iata raspunsurile pentru testele tale :
Cod:
735
740
745
-1
-1
750




Titlul: Răspuns: 006 Factorial
Scris de: A Cosmina - vechi din Iulie 23, 2009, 17:30:28
Am incercat si eu sa rezolv problema asta, am citit in topic ceva de o cautare binara. Nu-mi dau seama ace ar trebui sa caut binar ...  8-[


Titlul: Răspuns: 006 Factorial
Scris de: Codrea Marcel din Iulie 23, 2009, 18:05:00
Trebuie sa cauti binar n astfel incat n! sa respecte conditia din enunt.  :ok:

P.S. Sper sa nu fie prea explicit postul...ma gandesc ca in cele 8 pagini de discutii nu a ramas un mister rezolvarea problemei.


Titlul: Răspuns: 006 Factorial
Scris de: Rosca Valentin din Septembrie 26, 2009, 10:39:53
Am luat 100 puncte.
n>=p*4(se demonstreaza matematic)
si am folosit Functia lui Legendre.


Titlul: Răspuns: 006 Factorial
Scris de: Andrei din Octombrie 02, 2009, 21:46:22
Mi se pare mie sau evaluatorul nu creeaza fisiere de iesire? Pe calculatorul meu merge ok outputu.


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Misarca din Octombrie 02, 2009, 21:50:40
Păi nu evaluatorul crează fișiere de ieșire, ci sursa ta. El doar verfică dacă sunt corecte.


Titlul: Răspuns: 006 Factorial
Scris de: Andrei din Octombrie 02, 2009, 21:57:40
Multumesc ca faci pe desteptul cu mine. Oricum, scuze, abea acum am observat ca fisierele se numesc fact, eu m-am luat dupa numele paginii.


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Misarca din Octombrie 02, 2009, 22:10:44
Eu doar ți-am răspuns la întrebare. Nu înțeleg de ce te ataci, asta se înțelege din întrebarea ta.


Titlul: Răspuns: 006 Factorial
Scris de: Alexandru-Iancu Caragicu din Noiembrie 12, 2009, 20:16:24
Eu retin pt tot felul de puteri ale lui 5 cate zerouri as obtine:
5 -> 1
25 -> 6
(cate zerouri obtin pt o putere calculez de la cea precedenta *5+1).
Maresc puterea cat de mult pot fara ca numarul de zerouri asociat sa depaseasca p-ul, apoi scad din p nr de zerouri castigati de la puterea respectiva, si tot repet pana p ajunge 0. La fiecare pas adun puterea care am obtinut-o si rasp e suma lor. Dar nu iau decat 90 pcte. E vreo greseala in rationament?

P.S. Si la mine s-ar putea sa fie cam explicit, dar sunt curios de ce iau 90.


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Grigorean din Noiembrie 12, 2009, 21:25:26
Ai grija sa afisezi -1 cand nu este solutie?


Titlul: Răspuns: 006 Factorial
Scris de: Vlad Tarniceru din Decembrie 10, 2009, 16:30:07
0-urile la sfarsit nu se formeaza prin numar par*5?


Titlul: Răspuns: 006 Factorial
Scris de: Tabara Mihai din Decembrie 15, 2009, 02:59:01
0-urile la sfarsit nu se formeaza prin numar par*5?

Ba da.
Gandeste-te insa si la frecventa de aparitie a numerelor pare, respectiv a lui 5 in scrierea lui n!
 :thumbup:


Titlul: Răspuns: 006 Factorial
Scris de: Boaca Cosmin din Ianuarie 03, 2010, 22:00:34
pe toate testele programul imi lucreaza rapid si corect...mai putin pe testul 15 kre imi da tle si nu pricep dc...am testat ptr cea mai mare valoare a lui p,aceea fiind 10^8..si imi ruleaza in 0.1 sec...iau 95 d pct...va rog sa-mi ziceti dak aveti idee dc iau tle..mersi anticipat


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Ianuarie 03, 2010, 22:35:54
Nu retin exact care e faza cu el , stiu ca-l picam si eu la vremea respectiva , dar cu incorect. Probabil e cazul in care nu ai solutie si in implementarea ta programul cicleaza pe cazul asta :)


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Pojar din Ianuarie 06, 2010, 19:25:57
aveti idee ce inseamna  mesajul "Non-zero exit status." la evaluare??


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Ianuarie 06, 2010, 19:41:44
Non-zero exit status: Programul tau a returnat o valoare diferita de 0. Cel mai probabil ai uitat return 0; sau ceva similar. Poti primi acest mesaj si in loc de mesajul "Killed by signal": verifica si dupa erorile mentionate deasupra.
Verifica daca ai aceste erori si daca persista descriene ce ai facut :D


Titlul: Răspuns: 006 Factorial
Scris de: Rosca Valentin din Ianuarie 07, 2010, 11:39:54
Am luat 100 puncte.
n>=p*4(se demonstreaza matematic) :winner1:


Titlul: Răspuns: 006 Factorial
Scris de: Vlad Schnakovszki din Ianuarie 11, 2010, 10:52:01
Are cineva idee de ce primesc Signal 11 SIGSEGV pe toate testele ?
Am un singur vector cu 15 elemente si impartiri cu 0 nu am.
Am incercat toate corectarile posibile si tot aia imi da.
In MinGW ruleaza fara nici o eroare sau vreun warning.


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Ianuarie 11, 2010, 12:44:06
Sigur ai facut vectorul destul de mare sau un domeniu pentru valorile maxime pe care ti le poate da problema?


Titlul: Răspuns: 006 Factorial
Scris de: Vlad Schnakovszki din Ianuarie 14, 2010, 08:50:52
Dap.


Titlul: Răspuns: 006 Factorial
Scris de: alexandru din Ianuarie 14, 2010, 15:37:19
Incearca urmatoarele chestii:
Cod:
Click dreapta pe proiect > Set Active Configuration > Release
Click drepata pe proiect > Settings >  Click pe tabul Compile > Extra Warnings ( -W ).
Si apoi ruleaza din nou. 
Fa si tu niste teste si apoi un debug sa vezi ce se intampla :)


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Ianuarie 14, 2010, 18:53:40
Prima chestie ce mi-a iesit in ochi e while (ls<ld) , eu stiu ca trebuie <=, apoi aici mij=(ls+ld)/2; asta trebuie pusa 1 singura data ,la inceputul lui while ,nu de 2 ori.Si inca ceva: evita breakurile , sunt semne ale programarii neingrijite, foloseste pentru asta functii, dar nu cum le-ai implementat tu  :-k.
EDIT: Era pentru sursa care a sters-o  :wink:


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Ianuarie 14, 2010, 23:16:32
Ai gresit fisierele .


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Ianuarie 15, 2010, 09:35:36
Ai gresit fisierele .
Da intr-adevar, am avut timp sa ma uit si asta e. Fisierele sunt fact.in si fact.out. Uita-te aici (http://infoarena.ro/job_detail/382968) sursa ta, ia 100 puncte fara probleme. Alta data fii mai atent, chestii de-astea se pot intampla si la un OJI sau ONI, si apoi iti dai cateva in cap ca ai gresit o litera sau cine stie ce  :aha:.


Titlul: Răspuns: 006 Factorial
Scris de: Vlad Schnakovszki din Ianuarie 15, 2010, 10:07:34
Ai gresit fisierele .

Vaaai aia era  ](*,)
Am luat 100  :winner1:
Mersi mult, sa speram ca nu fac ceva de genu asta la olimpiada ca ma spanzur cu sireturile  :-'


Titlul: Răspuns: 006 Factorial
Scris de: Finaru Andrei Emanuel din Ianuarie 19, 2010, 17:31:04
Am 95 de puncte , doar WA pe testu 1  am grija de tot: afisez -1 cand trebuie, si iau chiar cel mai mic n care satisface conditia(asa reiesea din exemple), nush ce are ... Imi puteti da un indiciu de caz care poate mi-a scapat sau de o greseala in program? Chiar nu pricep ce are :| .


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Ianuarie 19, 2010, 19:28:08
Doar daca ne dai indicii cum ai facut, sau eventual sa pui sursa cu comentariile de rigoare


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Ianuarie 19, 2010, 21:32:36
N trebuie sa fie strict pozitiv , vezi cat iti afiseaza pentru p = 0.


Titlul: Răspuns: 006 Factorial
Scris de: Finaru Andrei Emanuel din Ianuarie 20, 2010, 13:47:59
@klamathix: Afisez -1.
Caut binar un n care a indeplineasca conditia si numar zerourile cu puterile lui 5, am grija sa consider toate puterile pana in n. Nu cred ca am gresit pe undeva, pica pe mai mult de 1 test daca era asa. Cred ca e o chestie de finete, vreun caz particular... Ma gandeam ca poate cineva s-a mai lovit de asta si stie cum se rezolva.


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Ianuarie 20, 2010, 16:07:04
Asta e problema: trebuie sa afiseze 1. Fa un if "mare" la inceput si verifica daca p=0 atunci afisezi 1, altfel sa faca restul calculelor.


Titlul: Răspuns: 006 Factorial
Scris de: Finaru Andrei Emanuel din Ianuarie 21, 2010, 16:56:12
100 in sfarsit:D:D:D :winner1:! Thx all pt sfaturi!


Titlul: Răspuns: 006 Factorial
Scris de: Cont de teste din Februarie 14, 2010, 11:18:26
La problema aceasta trebuie calcul cu numere mari? 10^8 de 0  :o


Titlul: Răspuns: 006 Factorial
Scris de: Dragos-Alin Rotaru din Februarie 14, 2010, 11:21:04
Nu. Ai cam 9 pagini din threadul asta si pe prima pagina (si nu numai) ai ceva indicii.


Titlul: Răspuns: 006 Factorial
Scris de: Cont de teste din Februarie 14, 2010, 11:29:23
Nu. Ai cam 9 pagini din threadul asta si pe prima pagina (si nu numai) ai ceva indicii.
Da dar e corect ce scrie in enunt sau nu?:(
Nu cumva trebuia p<8?


Titlul: Răspuns: 006 Factorial
Scris de: Dragos-Alin Rotaru din Februarie 14, 2010, 11:35:45
Nu. E bine asa cum e si garantez ca nu trebuie sa faci operatii pe numere mari . :)


Titlul: Răspuns: 006 Factorial
Scris de: Cont de teste din Februarie 14, 2010, 11:41:51
Nu. E bine asa cum e si garantez ca nu trebuie sa faci operatii pe numere mari . :)
Ok dar daca cum retii  numarul acela suficient de mare pentru cautarea binara?


Titlul: Răspuns: 006 Factorial
Scris de: Dragos-Alin Rotaru din Februarie 14, 2010, 11:45:33
Tu nu cauti N! ci il cauti pe N.
PS: Ai o formula ca sa vezi cate 0-uri are N! plecand de la N. Ti-am spus...citeste tot topicul.


Titlul: Răspuns: 006 Factorial
Scris de: Cont de teste din Februarie 14, 2010, 12:57:44
Tu nu cauti N! ci il cauti pe N.
PS: Ai o formula ca sa vezi cate 0-uri are N! plecand de la N. Ti-am spus...citeste tot topicul.

Numarul acela suficient de mare este cum il aflu?

L.E. : 5*10^8 imi ajunge?


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Februarie 14, 2010, 13:28:14
Tu trebuie sa cauti binar rezultatul, facand o functie care returneaza cate zerouri are un numar X.


Titlul: Răspuns: 006 Factorial
Scris de: Cont de teste din Februarie 14, 2010, 13:35:02
Da.
Dar nu  stiu intervalul.
Nu ar trebuie sa fie [0....5*10^8]?
Sau ma rog [0....5*p]?


Titlul: Răspuns: 006 Factorial
Scris de: alexandru din Februarie 14, 2010, 13:38:40
Intre [1...5*p] da :)


Titlul: Răspuns: 006 Factorial
Scris de: Cont de teste din Februarie 14, 2010, 13:41:16
Intre [1...5*p] da :)
Asa mersi de asta aveam nevoie.:)
+ la karma


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Februarie 14, 2010, 13:52:42
Intre [1...5*p] da :)
Asa mersi de asta aveam nevoie.:)
+ la karma
Eu am pus limita asta : 10000000000LL, nu ai cum sa pui 5*p, ca nu stii in fiecare caz pana unde sa mergi :)


Titlul: Răspuns: 006 Factorial
Scris de: alexandru din Februarie 14, 2010, 14:00:19
Daca faci pe cate exemple o sa vezi ca numarul cautat este  <= 5*p.
Cod:
p=2 10
p=3 15
p=4 20
p=6 25
....
p=13 55
....


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Februarie 14, 2010, 17:01:04
Da, ai dreptate nu am observat. Multumesc de observare  :D


Titlul: Răspuns: 006 Factorial
Scris de: Cont de teste din Februarie 14, 2010, 17:43:05
Am luat 100  :). Multumesc.


Titlul: as dori putin ajutor?
Scris de: Andrei Geogescu din Martie 10, 2010, 22:03:10
Cod:
#include<iostream.h>
#include<fstream.h>
#include<string.h>
int main()
{long a,b=1,i=2,c=1;
ifstream f("fact.in");
ofstream g("fact.out");
f>>a;
for(i=1;i<=a;i++)
b=b*10;
while(c%b!=0)
{c=c*i;
i++;}
g<<i;
return 0;}
 
daca privim logic..algoritmul trebuie sa mearga perfect...dar desigur..iau 5 pct daor la prima verificare..dupa care la a2a gresit iar de la 3 la 10 afiseaza mesajul "Killed by signal 8(SIGFPE)"...ceea ce inseamna ca undeva se imparte la 0.Asa fiind am observat ca in "for" se intampla ca b=0..ptr valori imense ale lui "a"..respectiv "p" din problema.Sfaturi?

[editat de moderator] foloseste tagul "code"


Titlul: Răspuns: 006 Factorial
Scris de: Cosmin-Mihai Tutunaru din Martie 10, 2010, 22:35:23
Păi nu e prea bună abordarea.
La rândurile:
Cod:
for(i=1;i<=a;i++)
b=b*10;
b va primi 10a. Iar cum a este destul de mare, chiar uriaș pentru ce faci tu aici, b va depăși cu mult valoarea tipului de date int/long, sau orice alt tip de date din c/c++.

Citește întreg topic-ul. Sigur vei găsi descrisă o metodă de rezolvare.
Spor.


Titlul: Răspuns: 006 Factorial
Scris de: Lodoaba Sorin din Martie 17, 2010, 21:55:13
folosesc nrcif(n)=n div5 +n div 5 div 5+.... shi asa mai departe ... ceva nu e bn??? iau 15 pcte..

Later Edit: de ce nu scrie tmpul pe care il facemm????

Later Later Edit:
imi merce pe toate ex date in topikurile de mai jos.. dar imi iese din timp.... ce sa fac...??? ](*,) ](*,) ](*,) ](*,) ](*,)
Cod:
program factorial;
var k,n:longint;
    f,t:text;

function fact(n,k:longint):longint;
var x:int64;
    i:longint;
begin
  x:=n;i:=0;
  repeat
    i:=i+x div 5;
    x:=x div 5;
    if i>k then break;
  until x=0;
  fact:=i;
end;

function cif(k:longint) :int64;
var i,x,h,n:longint;
    da:boolean;
begin
  n:=maxlongint;
  for i:=1 to n do
    begin
      x:=fact(i,k);
      if x=k then
        begin
          da:=true;
          h:=i;
          break;
        end;
      if x>k then break;
    end;
  if da then cif:=h
        else cif:=-1;
end;

begin
  assign(f,'fact.in');
  reset(f);
  read(f,k);
  close(f);
  n:=1;
  {------------------}
  if k=0 then k:=1
         else k:=cif(k);
  {------------------}
  assign(t,'fact.out');
  rewrite(t);
  write(t,k);
  close(t);
end.

Editat de admin: Nu mai posta consecutiv. Tagurile "code" se pun intre paranteze drepte.


Titlul: Răspuns: 006 Factorial
Scris de: Vlad Eugen Dornescu din Martie 18, 2010, 14:21:52
Pai iti iasa din timp pentru ca algoritmul folosit iti iasa din timp, si ... trebuie sa memorezi numarul ca sir de caractere, nu longint  #-o.

foarte adevarat graiesti...buna explicatie =)))


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Martie 18, 2010, 14:24:23
Am vrut sa spun ca este ineficient, m-am incurcat  :thumbdown:


Titlul: Răspuns: 006 Factorial
Scris de: Gabriel Bitis din Martie 18, 2010, 14:29:00
Cand n'ai nimic de zis.. mai bine nu zici nimic!  [-X
Chiar daca intentia ta e buna, de a ajuta... sfaturile gresite nu sunt bune pentru incepatori. Pe langa explicatia plina de logica cu "iasa din timp", si indicatia de a memora numarul ca sir de caractere e aiurea.


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Martie 18, 2010, 18:23:33
Sczue m-am incurcat cu un alt post scuze din nou  :-s


Titlul: Răspuns: 006 Factorial
Scris de: Idomir Alin din Aprilie 03, 2010, 21:22:12
Am incercat sa rezolv cu cautare binara. Am facut o functie, in care aflu de cate ori se imparte un numar la 5, iar in programul principal folosesc cautare binara (st=0;dr=1000;mij=(st+dr)/2;).Apelez functia cu acel mij(daca f(mij) = p atunci returnez mij altfel daca f(mij)<p st = mij + 1; altfel dr = mij - 1; si imi da intotdeauna -1.nu gaseste niciodata valoarea. Este gresit rationamentul?
 


Titlul: Răspuns: 006 Factorial
Scris de: alexandru din Aprilie 03, 2010, 21:43:44
Am incercat sa rezolv cu cautare binara. Am facut o functie, in care aflu de cate ori se imparte un numar la 5, iar in programul principal folosesc cautare binara (st=0;dr=1000;mij=(st+dr)/2;).Apelez functia cu acel mij(daca f(mij) = p atunci returnez mij altfel daca f(mij)<p st = mij + 1; altfel dr = mij - 1; si imi da intotdeauna -1.nu gaseste niciodata valoarea. Este gresit rationamentul?
1. Pot fi mai multe valori pentru care f( mij ) == p, tu o vrei doar pe cea mai mica.
2. Ai implementat corect functia f ?


Titlul: Răspuns: 006 Factorial
Scris de: Idomir Alin din Aprilie 03, 2010, 22:08:36
Imi gaseste valoarea, da nu pe cea mai mica. Am pus conditia daca (f(mij) = p && mij<val) atunci {val = mij;dr=mij-1;}(asa ma gandeam sa o gasesc pe cea mai mica),si am initializat val cu 1000 la inceput, dar se blocheaza compilatorul cand fac asa.

Edit:
Am facut direct in main pana la urma.
Cod:
while (st < dr)
     {
            mij = (st + dr)/2;
            a = mij; ct = 0;
            while (a % 5 == 0)
            {
            if (a % 5 == 0) {
                        ct++;
                        a = a / 5;
                        }
            }           
            if (ct == p && mij < val)  {val = mij; dr = mij - 1;}
            else
            if (ct < p && ct > 0)  st = mij + 1;
                       else dr = mij - 1;
                       }

Editat de moderator: Nu mai posta de mai multe ori consecutiv, editeaza-ti posturile anterioare.
Foloseste tagurile [ code ] [ /code ] cand postezi cod.
             


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Aprilie 05, 2010, 11:46:43
Sunt curios st si dr cum le-ai initializat inainte ?
Eu am facut asa : am aflat valoarea cum a fost (adica nu neaparat cea mai mica), si apoi am facut un for : for(;mij % 5;mij--) ; , care verifica daca restul impartiri lui mij la 5 nu este 0, decrementandu-l pe mij pana ajunge la o valoare care se imparte exact la 5 (deoarece ea este cea mai mica). Apoi verific daca ea este solutie, si daca nu afisez -1.


Titlul: Răspuns: 006 Factorial
Scris de: Halalai Tudor Andrei din Mai 05, 2010, 16:17:19
Am facut si eu mot-a-mot adica am luat un for de la cinci si am mers din cinci in cinci... ](*,)
Ideea e ca nu-mi merge si-mi da eroarea asta ciudata ca nu pot sa o descalcesc:
Citat
Eroare de compilare:
In file included from /usr/include/c++/4.2/backward/fstream.h:31,
                 from user.cpp:1:
/usr/include/c++/4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
user.cpp: In function 'int main()':
user.cpp:21: error: name lookup of 'i' changed for new ISO 'for' scoping
user.cpp:11: error:   using obsolete binding at 'i'
   
Acuma sa fiti si voi in materie va dau si codul:
Cod:
f>>o;
int s=0,q=0;
if(o!=0)
{
for(int i=5;s<=o;i=i+5)
{
q=i;
while(q%5==0)
{
s=s+1;
q=q/5;
}
}
if(s!=o)g<<-1;
else g<<i;
}
else g<<1;
Ps in C++ nu are nici o eroare. :readthis:


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Mai 05, 2010, 16:19:07
Declara i global, sau in interiorul main-ului si ar trebui sa mearga ( adica sa nu il declari in for ) .


Titlul: Răspuns: 006 Factorial
Scris de: Halalai Tudor Andrei din Mai 05, 2010, 17:43:13
Tnx
A mers. :yahoo:
Da' ce-i cautarea binara(cu for la mai toate am TLE)...
 :-s


Titlul: Răspuns: 006 Factorial
Scris de: alexandru din Mai 05, 2010, 17:51:23
Tnx
A mers. :yahoo:
Da' ce-i cautarea binara(cu for la mai toate am TLE)...
 :-s
http://infoarena.ro/problema/cautbin


Titlul: Răspuns: 006 Factorial
Scris de: FMIAnita Liviu din Mai 27, 2010, 17:25:32
Salut,eu am folosit un if(N%10==5 || N%10==0) .Pur si simplu nu am gasit alt numar,care inmultit cu oricare alt numar (inafara de 5 si 10) sa dea ultima cifra 0.Mai exista asa ceva?Eu m-am luat dupa ultima cifra,care poate fi 1,2,3,4,5,6,7,8,9,0 ,si i-am scos din calcul pe 5 si pe 0,deoarece 0 nu are nevoie de pereche,si 5 formeaza pereche cu unul dintre numerele pare dinaintea lui.Totusi nu merge.Asta e sursa:
Cod:
#include<fstream.h>
int main(){
int P,N,i,nr=0;
ifstream fin("fact.txt");
ofstream fout("fact1.txt");
fin>>P;
for(N=1;;N++){
if(N%10==0 || N%10==5)
nr++;
if(nr==P){
fout<<N;
break;}}
return 0;}
Un sfat? :D


Titlul: Răspuns: 006 Factorial
Scris de: Savin Tiberiu din Mai 27, 2010, 19:39:46
Hint: 25 * 4 = 100


Titlul: Răspuns: 006 Factorial
Scris de: FMI Romila Remus Arthur din Mai 27, 2010, 19:41:00
Citeste ce s-a discutat si iti vei da seama ce gresesti.De exemplu,cand inmultesti cu 25,se adauga 2 de 0 iar cand inmultesti cu 125,3(asta depinde de puterea lui 5 care apare in descompunerea numarului in factori primi).


Titlul: Răspuns: 006 Factorial
Scris de: Farcas Ionut din Iunie 02, 2010, 20:02:26
hmm....interesanta o chestie se ia  1*2*3*...*30 de ex are in total 6 zero la sfarsit  se ia de 3 ori  2*5  (2-5,12-15,22-25)  si de 3 ori 10 (10,20,30) si ajung la formula simpla ca n*5= raspuns dar totusi nu nimeresc testele.DC?


Titlul: Răspuns: 006 Factorial
Scris de: Paul-Dan Baltescu din Iunie 02, 2010, 20:25:30
Pentru ca mai poti scoate un 0, de exemplu din 14 - 25.


Titlul: Răspuns: 006 Factorial
Scris de: cristi din Februarie 14, 2011, 09:56:19
Cod:
var k,n,i,m:longint;
begin
     n:=0;i:=0;k:=0;
     while k<p do
     begin
          inc(n);m:=n;
          while m mod 5=0 do
          begin
               inc(k);
               m:=m div 5;
          end;
     end;
     determinare:=n;
end;

procedure afisare;
var g:text;
begin
     assign(g,'factorial.out');
     rewrite(g);
     write(g,determinare);
     close(g);
end;

begin
     citire;
     determinare;
     afisare;
end.
si imi da 0  ](*,) ](*,) ](*,) ](*,)

[editat de moderator] foloseste tag-ul "code" cand postezi cod pe forum!


Titlul: Răspuns: 006 Factorial
Scris de: Paul-Dan Baltescu din Februarie 14, 2011, 12:26:35
Bine iti face. :P Daca ai fi citit ce s-a discutat pana acum la aceasta problema ai fi stiut ce gresesti.


Titlul: Răspuns: 006 Factorial
Scris de: Radu Ghitescu din Februarie 24, 2011, 23:03:01
Cel mai eficient algoritm este urmatorul:
Zerouri n! = (n - suma cifrelor in baza 5 a lui n)/4. ;)


Titlul: Răspuns: 006 Factorial
Scris de: Pripoae Teodor Anton din Februarie 26, 2011, 05:29:42
Nu te cred.


Titlul: non 0 exit status.
Scris de: yonootz321 din Martie 14, 2011, 19:47:04
Are cineva vreo idee de ce imi da "non zero exit status." la toate testele? Programul functioneaza bine pe calculatorul meu... :'(


Titlul: Răspuns: non 0 exit status.
Scris de: Chibici Tiberiu din Martie 17, 2011, 11:40:26
Are cineva vreo idee de ce imi da "non zero exit status." la toate testele? Programul functioneaza bine pe calculatorul meu... :'(

Trebuie sa dai return 0 la sfarsitul functii int main()


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Martie 17, 2011, 11:46:13
El lucra in Pascal, nu cred ca asta-i problema. Cred ca nu a pus numele fisierelor bine, sau nu stiu ....


Titlul: Răspuns: 006 Factorial
Scris de: Dragan Andrei Gabriel din Aprilie 01, 2011, 20:54:04
Pentru cei care primesc non exit zero status cititi bine
Fisierul de intrare este FACT !!!
NU FACTORIAL !!!!!!!! ]
(*,)


Titlul: Răspuns: 006 Factorial
Scris de: Anusca Armand din Aprilie 02, 2011, 18:24:45
PAI in exemplul 2  arata fara 0 dar in 3 este cu 0.Nu mai inteleg  ](*,).


Titlul: Răspuns: 006 Factorial
Scris de: UAIC.VlasCatalin din Iulie 06, 2011, 13:00:48
este o solutie destul de ingenioasa la aceasta problema, eu am gasit-o si am luat 100p co    0 sec!    pe orice test. SUCCES   


Titlul: Răspuns: 006 Factorial
Scris de: Cristi B din Iulie 26, 2011, 10:07:30
 ](*,) ](*,) ](*,) poate sa-mi explice cineva dc imi iese din timp la sursa asta si iau dekt 20 pct??? scz dak am facut o gresala dar acum am trecut de la pascal la cpp si imi e putin mai greu
Cod:
#include <fstream.h>

long p,m,n,nr;

ifstream f("fact.in");
ofstream g("fact.out");

int main()
{
f>>p;
n=0;nr=0;n=0;
while(nr<p)
{
n++;
m=n;
long div=2;
while(m!=1)
{
if(m%div==0)
{
long ok=0;
for(long i=2;i<=div/2;i++)
if(div%i==0)
ok=1;
if(ok==0)
{
m=m/div;
if(div==5)
nr++;
}
}
else
div++;
}

}
if(nr==p)
if(p!=0)
g<<n;
if(nr>p)
if(p!=0)
g<<"-1";
if(p==0)
g<<"1";
return 0;
}

[editat de moderator] tag-ul "code"...


Titlul: Răspuns: 006 Factorial
Scris de: George Marcus din Iulie 26, 2011, 10:25:13
Solutia ta e ineficienta. Invata cautarea binara si apoi cauta in primele 10 pagini de la aceasta problema idei de rezolvare.


Titlul: Răspuns: 006 Factorial
Scris de: Cosmin Clapon din Iulie 31, 2011, 14:00:01
Eu nu inteleg de ce trebuie cautare binara si nici nu prea inteleg implementarea in problema asta.
Putem sa ne bazam doar pe cateva observatii matematice : 5*2 = 10, deci numarul de zerouri are legatura cu puterile lui 5.
Deci p se poate calcula ca mai jos si mai gasim o observatie (4p<=n) :
(http://img851.imageshack.us/img851/9739/msp339519gdf29g45030d6d.gif)

Asa ca putem calcula numarul de zerouri impartindu-l pe n la 5 pentru fiecare numar incepand cu n=4*p pana cand gasim numarul p cautat si se obtine o complexitate mai buna decat log2(P) cu doar 33 iteratii pentru p=10^8.


Titlul: Răspuns: 006 Factorial
Scris de: UAIC.VlasCatalin din Iulie 31, 2011, 14:59:30
La asta ma-m referit si eu Cosmin Clapon, cind am spus "o solutie ingenioasa", dar nu cred ca era cazu sa postezi prea explicit ideea :)


Titlul: Răspuns: 006 Factorial
Scris de: Paul-Dan Baltescu din Iulie 31, 2011, 20:15:58
Eu nu inteleg de ce trebuie cautare binara si nici nu prea inteleg implementarea in problema asta.
Putem sa ne bazam doar pe cateva observatii matematice : 5*2 = 10, deci numarul de zerouri are legatura cu puterile lui 5.
Deci p se poate calcula ca mai jos si mai gasim o observatie (4p<=n) :
(http://img851.imageshack.us/img851/9739/msp339519gdf29g45030d6d.gif)

Asa ca putem calcula numarul de zerouri impartindu-l pe n la 5 pentru fiecare numar incepand cu n=4*p pana cand gasim numarul p cautat si se obtine o complexitate mai buna decat log2(P) cu doar 33 iteratii pentru p=10^8.

Misto solutia, mai ales ca e la o problema atat de clasica pentru infoarena. Cred ca nu are rost sa fii certat ca ai postat-o, pentru ca oricum topic-ul asta nu mai ascunde secrete despre problema de mult timp.


Titlul: Răspuns: 006 Factorial
Scris de: Cosmin Clapon din August 02, 2011, 14:02:37
Are idee careva ce e gresit in sursa asta de iau numai 10 puncte? primesc wrong answer pentru celelalte teste.

Algoritmul nu are cum sa fie gresit pentru ca am implementat solutia de care am zis mai sus si oricum am facut cateva sute de teste (cu p chiar mai mare de 10^8) verificandu-le cu brute force si au fost toate corecte. Cazurile -1 si p=0 se iau si ele in calcul.

LE: sursa http://pastebin.com/9jaxCBJG


Titlul: Răspuns: 006 Factorial
Scris de: Endriu din Decembrie 15, 2011, 20:13:23
 :weightlift:


Titlul: Răspuns: 006 Factorial
Scris de: Bodnariuc Dan Alexandru din Ianuarie 18, 2012, 18:39:17
Hmm ce ciudat o cu variabilele declarate int ia 50 de pct iar aceiasi sursa cu long long ia 25 ??? sunt mai incete operatiile cu long long?? sau ce :annoyed:


Titlul: Răspuns: 006 Factorial
Scris de: Simoiu Robert din Ianuarie 18, 2012, 21:27:46
Clar, int-ul din cate stiu merge cel mai repede, long long cel mai incet, pentru ca e mai mare si operatiile merg mai incet, short-ul este de asemenea rapid, dar nu mai rapid decat int-ul ;).


Titlul: Răspuns: 006 Factorial
Scris de: Bodnariuc Dan Alexandru din Ianuarie 18, 2012, 21:50:42
k ms mi-a iesit pana la urma cu cautare :peacefingers:


Titlul: Răspuns: 006 Factorial
Scris de: George Marcus din Ianuarie 19, 2012, 14:52:54
long long merge mai incet fiindca ai de adunat mai multi biti, iar short nu merge mai rapede decat int fiindca inainte de a efectua operatiile oricum se transforma in int.


Titlul: Răspuns: 006 Factorial
Scris de: Cretu Bogdan din Ianuarie 20, 2012, 01:52:29
Nu am facut citirea din fisiere ... rog sa fie stearsa  :)
Multumesc!


Titlul: Răspuns: 006 Factorial
Scris de: Eugenie Daniel Posdarascu din Ianuarie 20, 2012, 14:04:31
Scuze dar eu nu inteleg foarte bine. :? Vrei sa iti fie stearsa sursa pentru ca nu ai pus fisiere?


Titlul: Răspuns: 006 Factorial
Scris de: Aruxandei Cosmin Andrei din August 06, 2012, 13:51:16
 :x DE CE ZICE CA N-AM FISIER DE IESIRE?!??!?! :annoyed: :angry: :fool: :weightlift: :eyebrow: [-X :indifferent: :thumbdown: :-k #-o :fighting:


Titlul: Răspuns: 006 Factorial
Scris de: Visan Radu din August 06, 2012, 13:52:40
Nu ai fisier de iesire pt ca in enunt scrie fact.in si fact.out, iar tu ai fac.in si fac.out.


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din August 06, 2012, 17:39:16
:x DE CE ZICE CA N-AM FISIER DE IESIRE?!??!?! :annoyed: :angry: :fool: :weightlift: :eyebrow: [-X :indifferent: :thumbdown: :-k #-o :fighting:

De ce zice ca n-am fisier de iesire?.
Fixed that for you.

Te rog sa adopti un ton echilibrat si respectuos in relatia cu ceilalti. Si sa nu ne devalorizezi emoticoanele, s-ar putea sa le folosim ca moneda nationala in curand :roll:.


Titlul: Răspuns: 006 Factorial
Scris de: Petenchea Alexandru din August 23, 2012, 11:22:09
0 factorial este 1 prin conventie  :P . Cred ca ar trebui sa fie specificat "cel mai mic numar natural nenul strict pozitiv" . Din punct de vedere matematic, exemplul 1 este gresit  :P


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din August 23, 2012, 11:44:11
Pai asta inseamna strict pozitiv :). "Numar natural nenul strict pozitiv" este un pleonasm.


Titlul: Răspuns: 006 Factorial
Scris de: Aruxandei Cosmin Andrei din Decembrie 20, 2012, 10:28:19
am inteles ca trebuie sa calculez factorialul... si cam atat...  :x iar asta e foarte simplu:

Cod:
#include<fstream>
using namespace std;
ifstream f("factorial.in");
ofstream g("factorial.out");
int n,p;
int main()
{
p=1;
f>>n;
for(int i=1;i<=n;++i)
{
p*=i;
}
g<<p;
g.close();
return 0;
}


Titlul: Răspuns: 006 Factorial
Scris de: Radu-Andrei Szasz din Decembrie 20, 2012, 11:30:20
Nu e chiar asa usor. Chiar si 20! iti iasa din orice tip de date. Trebuie sa gasesti o solutie mai buna la problema.

Hint: Incearca sa il scrii pe 10 (un 0 la final e echivalent cu numarul inmultit cu 10) ca fiind 2 * 5.


Titlul: Răspuns: 006 Factorial
Scris de: David Daogaru din Ianuarie 11, 2013, 18:09:07
[editat de moderator] Inteleg ca iti plac bananele, dar pe viitor te rog sa le tii doar pt tine.


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Mihnea din Februarie 16, 2013, 18:45:06
problema e simplă, și totuși foarte frumoasă dacă te apuci s-o „optimizezi”. nu știu dacă am voie sau nu să zic în comentarii rezolvări, așa că doar dau indicii. în primul rând după câteva încercări se vede că N și P sunt în dependență liniară (de gradul 1), așa că trebuie să existe o formulă între ei. acea formulă se află relativ ușor, sunt formule de liceu de la matematică, poate că de-aia mi-a venit ideea. acea formulă aproximează FOARTE aproape și mereu mai mic sau egal, deci căutarea e simplă. nu e nevoie de nicio căutare binară.


Titlul: Răspuns: 006 Factorial
Scris de: Prehari Romica din Februarie 17, 2013, 14:27:34
Imi spune si mie cineva de ce nu imi merge codul asta
Cod:
#include<stdio.h>

long long int i,p,k;

int main(void)
{
    scanf("%lld",&p);
    i=5*p;
    p=i;
    if(p>=25&&p%25!=0)
       {
           k=p/25;
           i-=k*5;
          }
      else
      if(p>=25)
      {
          k=(p-1)/25;
          i-=k*5;
      }

    printf("%lld",i);

  return 0;
}
Am incercat exemplele astea si mi-a mers pentru toate:
N!         numarul de zerouri de la sfarsit
25                 6
125               31
625               156
3125             781
15625           3906
78125           19531
390625         97656
1953125       488281
9765625       2441406
48828125     12207031
244140625   61035156
1220703125 305175781

Dar pentru astea nu:
10 000 000=40 000 010
99 999 999=400 000 010
24 165 865=96 663 485
23 750 754=95 003 040




Titlul: Răspuns: 006 Factorial
Scris de: Andru Felipe Zuniga din Aprilie 04, 2013, 23:13:15
Cred că nu merge ceva aici:
Cod:
program fact;
var
 vector:array[0..12] of longint= (1, 6, 31, 156, 781, 3906, 19531, 97656, 488281, 2441406, 12207031, 61035156, 1000000001);
 p,k,zerouri:longint;
 marime,i:byte;
 fin,fout:text;
begin
 assign(fin,'fact.in');
 reset(fin);
 read(fin,p);
 close(fin);
 marime:=0;
 while p>vector[marime] do
  marime:=marime+1;
 zerouri:=p;
 for i:=marime downto 1 do
  begin
   zerouri:=zerouri-p div vector[i];
   if p mod vector[i]>=vector[i]-i then
    p:=-1;
  end;
 assign(fout,'fact.out');
 rewrite(fout);
 if p=0 then
  write(fout,1)
 else
  if p=-1 then
   write(fout,-1)
  else
   write(fout,zerouri*5);
 close(fout);
end.


Titlul: Răspuns: 006 Factorial
Scris de: Nicu B. din Aprilie 05, 2013, 23:53:42
Problema are legatura cu puterile lui 5, nu cu raspunsurile pentru anumite puteri ale lui 5 din fisierul de intrare.
Ca sa ai un 0 la final la rezultatul factorialului, trebuie sa observi din ce se formeaza.


Titlul: Răspuns: 006 Factorial
Scris de: Carp Theodor-Nicolae din Mai 25, 2013, 19:09:22
Aveti probleme de incepator?


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Constantinescu din Mai 25, 2013, 21:44:32
In general, pe infoarena se pun probleme care pot contribui in mod semnificativ la pregatirea individuala (cu alte cuvinte, e greu de gasit o problema intr-adevar usoara pe infoarena). Iti recomand sa incerci de pe campion.edu.ro/arhiva problemele cadouri, psp, alo, case1, bancomat si barca (daca inca nu ai rezolvat problema capete). Iti urez succes si sa nu uiti niciodata ca toti am fost odata incepatori si ca vei depasi, daca inveti din placere, imediat momentul. :thumbup:


Titlul: Răspuns: 006 Factorial
Scris de: Cretu Bogdan din Iunie 26, 2013, 21:33:28
http://www.infoarena.ro/job_detail/967027?action=view-source (http://www.infoarena.ro/job_detail/967027?action=view-source)
Ce as mai putea sa fac sa-mi intre in timp sursa?
Primesc TML pe 10 teste  ](*,)


Titlul: Răspuns: 006 Factorial
Scris de: George Marcus din Iunie 26, 2013, 21:49:58
Sa nu apelezi de doua ori functia. Ii stochezi valoarea returnata si apoi o folosesti de cate ori vrei :)


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Iunie 27, 2013, 03:02:11
Complexitatea e log ^ 2 la problema asta, poti sa faci ce vrei cu constanta, trebuie sa-ti intre in timp. Daca iei TLE inseamna ca cicleaza. De exemplu, cred ca-ti cicleaza cand raspunsul e -1.


Titlul: Răspuns: 006 Factorial
Scris de: Cretu Bogdan din Iunie 27, 2013, 09:07:46
George Marcus:In while trebuie sa o apelez mereu pentru ca variabila mid se schimba.
Mihai Calancea:Poti sa fii mai explic, te rog? Chiar nu inteleg de ce cicleaza cand raspunsul e -1.


Titlul: Răspuns: 006 Factorial
Scris de: Boaca Cosmin din Iunie 27, 2013, 11:14:26
Nu m-am uitat foarte atent dar cred ca daca nu ai solutie si se ajunge la min = max in while iti cicleaza.


Titlul: Răspuns: 006 Factorial
Scris de: George Marcus din Iunie 27, 2013, 11:47:49
Cod:
if (fct(mid)<p) min=mid;
else if (fct(mid)>p) max=mid;
Aici ma refer. O apelezi de doua ori cu acelasi mid.


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Iunie 27, 2013, 11:55:06
Iti cicleaza fiindca ajunge la min = max cum spune Cosmin mai sus. Nu trebuie sa mai incluzi mid-ul in intervalul de cautare, stii deja ca nu e solutie.


Titlul: Răspuns: 006 Factorial
Scris de: Cretu Bogdan din Iunie 27, 2013, 18:05:28
http://www.infoarena.ro/job_detail/967457?action=view-source (http://www.infoarena.ro/job_detail/967457?action=view-source)

Bun...am ajuns cu sursa pana in stadiul acesta.
Am modificat din min<=max in min<max si am folosit o variabila 'val' care retine fct(mid) - ca sa n-o mai apelez de 2 ori.
Diferenta nu s-a simtit...tot 50 de puncte iau :D
Alte idei?


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Iunie 27, 2013, 18:18:10
Pai iti cicleaza si cu min < max, nu asta era partea pe care trebuia sa o repari. Ti-am mai spus si in alt thread, invata sa-ti faci debug, sa vezi ce se intampla de fapt in cod. Pentru 5, daca nu gresesc, o sa-ti ruleze la infinit.


Titlul: Răspuns: 006 Factorial
Scris de: Cretu Bogdan din Iunie 27, 2013, 19:38:54
Stiu sa folosesc debug-ul dar...nu stiam ca asta era problema (ca cicla).
Am rezolvat problema cu mersul in gol, iar acum a aparut alta: primesc WA pe cateva teste :D
Sa fie de la cautare???

Cod:
#include <iostream>
#include <fstream>
#define NMax 100000001
using namespace std;
ifstream f("fact.in");
ofstream g("fact.out");
int fct (int x)
{
    int a=5,rez=0;
    while (x/a)
    {
        rez=rez+x/a;
        a=a*5;
    }
    return rez;
}
int main ()
{
    int p,val;
    f>>p;
    if (p==0) g<<1;
    else
    {
        int min=1,max=NMax,mid;
        bool ok=false;
        while (min<max && !ok)
        {
            mid=(min+max)/2;
            val=fct(mid);
            if (val<p) min=mid+1;
            else if (val>p) max=mid-1;
            else ok=true;
        }
        if (ok)
        {
            while (mid%5) mid--;
            g<<mid;
        }
        else g<<-1;
    }
}
PS:ms de pontul cu ciclarea :P


Titlul: Răspuns: 006 Factorial
Scris de: Dragan Andrei Gabriel din Iunie 27, 2013, 21:09:26
Inlocuieste Nmax cu 1 miliard, si pune in while min<=max :D


Titlul: Răspuns: 006 Factorial
Scris de: Cretu Bogdan din Iunie 27, 2013, 21:17:13
Multam! :D
 :yahoo: :yahoo:


Titlul: Răspuns: 006 Factorial
Scris de: Eladiv Stefan din Noiembrie 22, 2013, 10:33:53
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    int p,t;
    ifstream f("fact.in");
    ofstream g("fact.out");
    f>>p;
    t=p/5;
    if(p%6==5)
        g<<-1;
    else
        {
            if(p==0)
            g<<1;
        else
        {
        if(p%5!=0)
            g<<(p-t)*5;
        else g<<(p-t+1)*5;
    }
    }
    return 0;
}

Imi poate spunce cineva de ce iau doar 15 puncte?


Titlul: Răspuns: 006 Factorial
Scris de: Nicula Stefan Dorin din Februarie 12, 2014, 15:00:53
Eu am rezolvat astfel problema..... cu toate ca rezultatele imi dau primesc decat 25 de puncte

#include<iostream>
#include<fstream>
using namespace std;
ifstream f("fact.in");
ofstream g("fact.out");
int main()
{
    int p,nr2,nr5,nr,x,k,minim;
    f>>p;
    nr2=0;
    nr5=0;
    nr=0;
    k=2;
    while(nr<p)
    {
        x=k;
        while(x%2==0)
        {
            nr2++;
            x=x/2;
        }
        while(x%5==0)
        {
            nr5++;
            x=x/5;
        }
        if(nr2<nr5) minim=nr2;
        else minim=nr5;
        nr=nr+minim;
        nr2=nr2-minim;
        nr5=nr5-minim;
        k++;
    }
    k--;
    if(nr==p)
        g<<k;
    else g<<"-1";
    return 0;
}


Titlul: Răspuns: 006 Factorial
Scris de: Nicula Stefan Dorin din Februarie 17, 2014, 14:50:01
Eu am rezolvat astfel problema..... cu toate ca rezultatele imi dau primesc decat 25 de puncte

#include<iostream>
#include<fstream>
using namespace std;
ifstream f("fact.in");
ofstream g("fact.out");
int main()
{
    int p,nr2,nr5,nr,x,k,minim;
    f>>p;
    nr2=0;
    nr5=0;
    nr=0;
    k=2;
    while(nr<p)
    {
        x=k;
        while(x%2==0)
        {
            nr2++;
            x=x/2;
        }
        while(x%5==0)
        {
            nr5++;
            x=x/5;
        }
        if(nr2<nr5) minim=nr2;
        else minim=nr5;
        nr=nr+minim;
        nr2=nr2-minim;
        nr5=nr5-minim;
        k++;
    }
    k--;
    if(nr==p)
        g<<k;
    else g<<"-1";
    return 0;
}

Am probleme cu timpul. Ma poate ajuta cineva??



Titlul: Răspuns: 006 Factorial
Scris de: Mocanu George din Februarie 17, 2014, 22:21:33
Eu am rezolvat astfel problema..... cu toate ca rezultatele imi dau primesc decat 25 de puncte

Cod:
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("fact.in");
ofstream g("fact.out");
int main()
{
    int p,nr2,nr5,nr,x,k,minim;
    f>>p;
    nr2=0;
    nr5=0;
    nr=0;
    k=2;
    while(nr<p)
    {
        x=k;
        while(x%2==0)
        {
            nr2++;
            x=x/2;
        }
        while(x%5==0)
        {
            nr5++;
            x=x/5;
        }
        if(nr2<nr5) minim=nr2;
        else minim=nr5;
        nr=nr+minim;
        nr2=nr2-minim;
        nr5=nr5-minim;
        k++;
    }
    k--;
    if(nr==p)
        g<<k;
    else g<<"-1";
    return 0;
}

Iti da "decat" 25 de puncte fiindca iti iese din timp(Time limit exceeded.).
Din cate vad tu aflii si puterea lui 2, ceea ce este inutil fiindca puterea lui 2 va fi mai mare ca puterea lui 5.
Poate te va ajuta si urmatorul post:
Eu nu inteleg de ce trebuie cautare binara si nici nu prea inteleg implementarea in problema asta.
Putem sa ne bazam doar pe cateva observatii matematice : 5*2 = 10, deci numarul de zerouri are legatura cu puterile lui 5.
Deci p se poate calcula ca mai jos si mai gasim o observatie (4p<=n) :
(http://img851.imageshack.us/img851/9739/msp339519gdf29g45030d6d.gif)

Asa ca putem calcula numarul de zerouri impartindu-l pe n la 5 pentru fiecare numar incepand cu n=4*p pana cand gasim numarul p cautat si se obtine o complexitate mai buna decat log2(P) cu doar 33 iteratii pentru p=10^8.


Titlul: Răspuns: 006 Factorial
Scris de: Never Roll din Februarie 24, 2014, 19:40:40
Am trimis problema gresita ! :ok:


Titlul: Răspuns: 006 Factorial
Scris de: Ciprian O. din Aprilie 04, 2014, 20:43:14
Salut, am si eu o problema la acest program: Imi da TLE  ](*,) ](*,) ](*,)
Aveti aici ceea ce am facut (50 de puncte, la restul am TLE) :

#include <fstream>
 
using namespace std;
ifstream fin("fact.in");
ofstream fout("fact.out");
int n, fact, aux, sw,k;
int main()
{
    fin>>n;
    if(n==0) k=1;
 
 
    while(n>0)
    {
        sw=0;
        fact=fact+5;
        aux=fact;
        while(aux%5==0)
            {aux=aux/5; sw++;}
        n=n-sw;
 
    }
 
        if(n==0&&k==0)fout<<fact;
        else if(k==1) fout<<"1";
        else fout<<"-1";
 
    return 0;
}

Imi puteti da idei pentru optimizarea programului :(, ma chinui de ceva timp... Mersi :)


Titlul: Răspuns: 006 Factorial
Scris de: Mocanu George din Aprilie 04, 2014, 21:31:53
Te-ar putea ajuta:
  • daca exista solutie atunci 4*P<=N;
  • o formula cu care poti afla de cate ori apare un anumit numar(sa zicem k) in descompunerea tuturor numerelor mai mici ca un numar(sa zicem n)
    S=[n/k1]+[n/k2]+[n/k3]+...+[n/ki]; i-ul fiind exponentul maxim astfel incat ki<=n si []- parte intreaga


Titlul: Răspuns: 006 Factorial
Scris de: Petru Trimbitas din Mai 09, 2014, 14:28:38
Pentru p=0 raspunsul corect ar trebui sa fie 0 nu 1


Titlul: Răspuns: 006 Factorial
Scris de: Andrei Constantinescu din Mai 10, 2014, 14:20:43
Pentru 0 raspunsul corect este totusi 1, conform enuntului:
Citat
Sa se gaseasca cel mai mic numar natural strict pozitiv N pentru care N! are exact P cifre de 0 la sfarsit.
Daca nu era insa pusa conditia de numar strict pozitiv, atunci raspunsul corect ar fi fost 0, cum zice si Petru.


Titlul: Răspuns: 006 Factorial
Scris de: Cristi Gherghina din August 21, 2014, 16:20:09
am si eu nevoie de ajutor, primesc punctaj mic si nu inteleg de ce, pentru 0 si 2 din imagine, programul arata corect, dupa nu.

Ma puteti ajuta va rog? asta e ce am scris.

#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

ifstream f("fact.in");
ofstream g("fact.out");

int main()
{
    long long p;
    f>>p;
    long long numar,i;
    numar=1;  i=1;
    long long fact;
    long long k=0;
    long long zero=1;

    //cati de zero la sfarsit
    while(k!=p)
    {
        zero=zero*10;
        k++;
    }

    while(numar%zero!=0)
    {
        numar=numar*i;
        i++;
        if(numar%zero==0)
            fact=i;
    }
    fact--;
    g<<fact;

    return 0;
}


Titlul: Răspuns: 006 Factorial
Scris de: bieltz vlad din Ianuarie 27, 2015, 18:21:10
Cod:
#include <iostream>
#include<fstream>

using namespace std;

int main()
{
    long P;
    int v[1000],stop,i=1,n=0,k,t;
    ifstream f("factorial.in");
    ofstream g("factorial.out");
    f>>P;
  v[1000]=1;
  while(stop!=P)
    {t=0;
        stop=0;
    k=1000;
        v[k]*=i;
        while(v[k]>=10){n=v[k];k--;v[k+1]=n%10;v[k]+=n/10;}
        for(n=1000;n<=k&&t==0;n--){if (!v[n])stop++ ;else t=1;}
i++;
    }
    g<<i;
    f.close();g.close();
}

de ce nu merge?


Titlul: Răspuns: 006 Factorial
Scris de: Mihai Calancea din Ianuarie 27, 2015, 19:58:19
Două sfaturi o abordare mai productivă:

- Discuția ar trebui să aibă loc la nivel de idei, nu de cod. E mai ușor pentru toată lumea :) Explică ce vrei să faci acolo.
- Înainte să postezi, încearcă să fii cât mai exigent cu soluția pe care o ai. Vezi dacă sigur ai înțeles bine limitele, enunțul, etc  :)


Titlul: Răspuns: 006 Factorial
Scris de: Stefan Dumitru din Iulie 18, 2015, 01:54:38
Am si eu o intrebare,va rog frumos,puteti sa-mi spuneti de ce iau 10  doar 10 pct.
M-am gandit ca prima data sa fac o fariabila care sa ia n*5 si dupa sa scad de fiecare data cand dau de puterile lui 5 scad din aux corespunzator,multumesc!
#include <fstream>
using namespace std;
ifstream in("fact.in");
ofstream out("fact.out");
int main(){
   long long n,i,j,s=1,p=-5;
   in>>n;
   long long aux;
   aux=n;
     aux=aux*5;
   if(n==0)
    {
        out<<"-1";
        return 0;
    }
   for(i=1;i<=100000000;i++)
    {
        s=s*5;
        p=p+5;
        if(s>aux)
        {
            out<<aux;
            return 0;
        }
        if(s==n)
        {
            out<<"-1";
            return 0;
        }
        if(s<aux)
        {
            aux=aux-p;
        }


    }
}


Titlul: Răspuns: 006 Factorial
Scris de: vladdd din Februarie 02, 2019, 18:28:35
SUPER TARE  :banana:
[/i]