infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Mircea Pasoi din Februarie 24, 2005, 20:51:47



Titlul: 051 Pascal
Scris de: Mircea Pasoi din Februarie 24, 2005, 20:51:47
Aici puteţi discuta despre problema Pascal (http://infoarena.ro/problema/pascal).


Titlul: 051 Pascal
Scris de: Iorgulescu Calin din Aprilie 21, 2005, 21:48:05
:cry: Va rog mult.... am incercat exact metoda din solutiile de la pre ONI runda 2... Exact asa....
parcurg randul....calculez puterea fact. primi in desc. lui r! apoi in r-c! si apoi in c!. Apoi fac puterea lui r - puterea lui r-c - puterea lui c. Am tratat si cazul divizorilor neprimi. Si nu iau decat 60 de puncte. Oricine stie o idee de optimizare... Macar un indiciu....


Titlul: 051 Pascal
Scris de: Bogdan-Cristian Tataroiu din Aprilie 22, 2005, 09:28:36
Calculeaza intr-un vector puterea factorilor din numerele de la 1 la r ( fac = fac[i-1] + nrdiv(i) ) si dupa aia la verificare vezi dc fac[r] - fac[r-i] - fac > 0, i de la 1 pana la r
Daca calculai pt fiecare elem numarul de factori din r-c! si din c!, calculai de 2 ori numarul de factori pt fiecare numar de la 1 la r.
ex:
r=5 c=1 calculai fac(1) si fac(4)
r=5 c=4 calculai fac(4) (din nou) si fac(1) (din nou)


Titlul: 051 Pascal
Scris de: u-92 din Aprilie 23, 2005, 11:38:53
si eu tot 60 de puncte luam.. dar am facut urmatoarele optimizari:
1) mergi doar pana la r/2, nu verifici tot randul fiindca e simetric
2) calculezi puterea la care apare d in r! (fie ea "p"), si dupa aia ca sa vezi puterea la care apare in (r-1)! scazi din p puterea la care apare d in descompunerea lui r, dupa aia scazi din noua putere puterea la care apare d in r-1.. si tot asa.. acelasi idee o aplici si pentru a vedea puterea lui d in j!

succes.


Titlul: 051 Pascal
Scris de: Iorgulescu Calin din Aprilie 25, 2005, 08:40:16
Mersi amandurora.... Cu varianta cu vectorul am luat 100 de puncte \:D/ . Iar u-92 mi-a lamurit ideea mea originala.... Fiindca chiar nu intelegeam ( P.S. : Si eu mergeam tot pana la r/2  :wink: ) de ce nu mergea cu formula si acum e destul de clar. Multumesc mult! Bafta in continuare!  :wink:


Titlul: 051 Pascal
Scris de: cristi8 din Mai 02, 2005, 23:29:51
40/100... iau WA la 6 teste.
am citit si articolul cu solutie, si am vazut ca trebuie facut cazul cand d nu este prim.

...nu merge sa se calculeze la fel ? adica [n/d] + [n/d^2] + [n/d^3] + ...


Titlul: 051 Pascal
Scris de: Bogdan-Cristian Tataroiu din Mai 03, 2005, 07:10:15
Citat din mesajul lui: Fr3eM4n
40/100... iau WA la 6 teste.
am citit si articolul cu solutie, si am vazut ca trebuie facut cazul cand d nu este prim.

...nu merge sa se calculeze la fel ? adica [n/d] + [n/d^2] + [n/d^3] + ...



NU. Daca vrei sa afli puterea la care se afla 4 de ex. in 10! atunci ti-ar da:
[10/4]+[10/16]=2. Daca insa ai calcula puterea la care se afla 2 in 10 ! si ai imparti totul la 2 ( 4=2^2 ) ai obtine: ( [10/2] + [10/4] + [10/8] ) / 2 = ( 5 + 2 + 1 ) / 2 = 4. Formula care ai zis-o merge doar pentru numere prime. In cazul de mai sus, cand calculai cu [10/4]+[10/16]+.. se ignora un factor de 2 din numarul 2,  unul din numarul 6, unul din 8 si unul din 10. Inmultite acesti factori pierduti dau 2^4 = 4^2 de unde rezulta diferenta de 2 data de cele doua calcule.


Titlul: 051 Pascal
Scris de: cristi8 din Mai 03, 2005, 10:01:40
da... good point.. mersi mult.

i'll never solve problems after 0:00 again :D


Titlul: 051 Pascal
Scris de: Tira Cristian din Februarie 17, 2006, 16:01:40
Imi spune cineva ce poate sa fie cu "Fisier de iesire lipsa!". Programul meu imi creeaza fiesierele si imi da raspunsuri corecte iar cand o trimit primesc aceeasi eroare si 0 pc.
 Please I'm desperate! :fighting:


Titlul: 051 Pascal
Scris de: Silviu-Ionut Ganceanu din Februarie 17, 2006, 17:10:38
Sigur ai scris corect numele fisierului de iesire ?

Zi-mi user-ul tau pe infoA.

Silviu


Titlul: 051 Pascal
Scris de: Tira Cristian din Februarie 20, 2006, 12:43:16
Acelasi, Crusher. Dar am facut-o inca o data de la inceput si acum imi da cat de cat un amarat de 10 pc. Dar ieri am descoperit o mica mare ghidusie si am sa incerc cu aia sa vad cum se descurca in lume ca e mai optima decat prima.   :shock:


Titlul: Raspuns: 051 Pascal
Scris de: razvan brezulianu din Noiembrie 16, 2006, 13:52:29
mai ce inseamna SIGKILL am trimis acesta problema si mi-a dat SIGKILL la fiecare test :'(


Titlul: Raspuns: 051 Pascal
Scris de: Marius Stroe din Noiembrie 16, 2006, 14:24:34
mai ce inseamna SIGKILL am trimis acesta problema si mi-a dat SIGKILL la fiecare test :'(

Ai declarat mai mult de 64 MB, cred ...


Titlul: Raspuns: 051 Pascal
Scris de: Adrian Dobrescu din Noiembrie 16, 2006, 18:32:57
cand depasesti dimensiunea tablourilor, pe care ai declarat-o, iti da erori de genul asta:
sigkill sau sigsegv


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 04, 2007, 21:18:59
Bun...si pt a calcula n!/(n-p)!*p! solutia optima care ar fi? ca banuiesc ca nu backtracking


Titlul: Răspuns: 051 Pascal
Scris de: Florian Marcu din Mai 04, 2007, 21:25:25
Nu prea vad ce treaba ar avea back-ul...Vezi poate te ajuta articolul cu solutii.... [ http://infoarena.ro/preoni-2005/runda-2/solutii ]


Titlul: Răspuns: 051 Pascal
Scris de: Andrei Homorodean din Mai 04, 2007, 21:39:35
n!/((n-p)!*p!) - nu n!/(n-p)!*p!, adica combinari de n luate cate p. Exista o recurenta pentru asa ceva, si anume C(n, p) = C(n-1, p-1) + C(n-1, p).

Vezi triunghiul lui pascal.

1
1 1
1 2 1
1 3 3 1

C(n, 0) = C(n, n) = 1


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 04, 2007, 21:51:37
Florian in caz ca nu te-ai prins trebuie sa generezi un vector in care sa retii toate numerele de pe al n rand al triunghiului pascal!! si spune ca se genereaza cu n!/(n-p)!*p!.......daca intelegi ce spun.....si homorodean chiar atat de proasta nu sunt ca sa nu stiu cum e...scuze am uitat o paranteza


Titlul: Răspuns: 051 Pascal
Scris de: Florian Marcu din Mai 04, 2007, 22:07:46

C(n, 0) = C(n, n) = 1

Este bine...am implementat relatia de recurenta si imi iese, insa nu ar trebui C(0,0)=1 in loc de c(n,0)?

Florian in caz ca nu te-ai prins trebuie sa generezi un vector in care sa retii toate numerele de pe al n rand al triunghiului pascal!! si spune ca se genereaza cu n!/(n-p)!*p!.......daca intelegi ce spun...

Am spus doar k nu are ce cauta back-ul...relatia pe care a dat-o Andrei Homorodean kred k este arhisuficienta...


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 04, 2007, 22:10:08
Ms....pai da dar mi-ai dat sa ma uit peste solutia oficiala..dar acolo nu spune nimic despre asta :P
si nu ar trebui C(0,0) in loc fde C(n,0)--> pt ca n!/((n-0)!*0!)=1


Titlul: Răspuns: 051 Pascal
Scris de: Florian Marcu din Mai 04, 2007, 22:14:34
Ok. Insa am zis "poate te ajuta"..! Un articol cu solutii iti poate oferi idei. Intr-adevar..se pare k nu zice nimik de ideea pe care ai abordat-o tu, insa eu am vrut doar sa ajut. :D Orikum..e bine k am invatat relatia de recurenta pt triunghiul lui Pascal... Multumesc, Andrei Homorodean!  :thumbup:


Titlul: Răspuns: 051 Pascal
Scris de: Andrei Homorodean din Mai 04, 2007, 22:22:51
n ia valori de la 0 incepand.(n nu tine de datele problemei sau ceva in genul, vorbesc de generalitate)


Titlul: Răspuns: 051 Pascal
Scris de: Florian Marcu din Mai 04, 2007, 22:24:46
 ](*,) Mda...greseala mea..Abia am invatat recursivitatea si ink o mai incurc..sorry..


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 04, 2007, 22:36:13
Mai am folosit recurenta c(n,p)=c(n-1,p-1)+c(n-1,p), insa iau TLE la 8 test...ma poate ajuta cineva pls?


Titlul: Răspuns: 051 Pascal
Scris de: Andrei Homorodean din Mai 04, 2007, 22:42:23
Incearca solutia oficiala, m-am uitat si eu peste sursa acum(o facusem mai demult), si am facut ca si in solutia oficiala. Cam multe TLE indeed :P


Titlul: Răspuns: 051 Pascal
Scris de: Florian Marcu din Mai 04, 2007, 22:46:34
Mda..eu iau 30 de puncte folosind relatia de recurenta...cu TLE pe restu`....se pare k tot la aia oficiala am ajuns... :)


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 05, 2007, 20:22:27
Mai am acum o singura problema am implementat problema si am luat 90 de punce cu TLE la ultimul test, ma poate ajuta cineva?
Test Timp executie Memorie folosita Mesaj Punctaj/test
1  0ms        16kb         Ok!                      10
2  1052ms    39172kb   Ok!                      10
3  860ms     19640kb    Ok!                      10
4  704ms     26156kb    Ok!                      10
5  216ms     13720kb    Ok!                      10
6  0ms        12kb         Ok!                      10
7  0ms        8kb           Ok!                      10
8  36ms      896kb        Ok!                      10
9  0ms        8kb           Ok!                      10
10 1264ms  39168kb      Time limit exceeded. 0
Punctaj total 90


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 05, 2007, 22:08:30
Cel mai rapid(optim)..cum pot afla la ce putere apare 2 intr-un numar???


Titlul: Răspuns: 051 Pascal
Scris de: Ionescu Vlad din Mai 05, 2007, 22:27:18
probabil testezi daca n % 2 == 0 si apoi faci n /= 2

incearca sa faci operatiile astea pe biti: if ( (n & 1) == 0 ) pt modulo si n = (n >> 1) pt impartire

cel putin la mine asta a fost problema...


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 05, 2007, 22:33:12
M-am gandit sa fac un vector in care sa retin pt i=1 la r puterea la care apare 2 de ex in i!. Nu ma poate ajuta cineva sa fac cel mai optim(in free pascal)


Titlul: Răspuns: 051 Pascal
Scris de: Ionescu Vlad din Mai 05, 2007, 22:35:49
da, faci normal, vezi de cate ori se imparte la 2 cu un while. atata doar ca in loc de impartire la 2 si modulo 2, faci operatiile pe biti pe care ti le-am spus.

64 & 1 == 0, 64 >> 1 = 32 etc..


Titlul: Răspuns: 051 Pascal
Scris de: Savin Tiberiu din Mai 06, 2007, 07:38:44
in pascal operatiile pe biti sunt :

& - AND
>> - shr


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 06, 2007, 08:53:53
stai mai usor ca nu inteleg ce modulo? si cum se face impartirea pe biti?


Titlul: Răspuns: 051 Pascal
Scris de: Savin Tiberiu din Mai 06, 2007, 09:32:45
pai zici ca ai nevoie sa vezi la ce putere apare 2 in descompunerea numarului x. Ei probabil ca u faci ceva de genu

Cod:
p:=0;
while (x mod 2 = 0) do begin x = x div 2;p:=p+1;end;
La sfarsit in variabila p ai exponentul. Ei operatori mod si div sunt destul de inceti. Avand in vedere ca ai impartire la 2 poti folosi operatii pe biti astfel:
ca sa afli restul lui x la 2 trebuie sa stii cel mai nesemnificativ bit din descompunerea lui (daca e 1 atunci restul e 1, altfel e 0). Spre ex 5 in baza 2 = 101 - ultimul bit e 1 deci restul e 1, 4 in baza 2 = 100 ultimul bit e 0 deci restul e 0. Ca sa afli acest bit poti sa aplici operatorul AND. Astfel: x AND 1 iti va returna 1 daca ultimul bit e 1, 0 in caz contrar, adica intocmai restul care iti trebuie tie.
Ptr impartire la 2 trebuie sa faci un shift right (shr) la tot sirul de biti. Spre exemplu 6 = 110. Daca mut toti biti o pozitie spre dreapta voi ajunge la 11 care e 3 (adik exact 6 div 2). Sintaxa ptr asta e :
Cod:
x := x shr k;
k e numarul de pozitii cu care muti sirul. Practic aceasta operatie il imparte pe x la 2^k, in cazul tau k trebuie sa fie 1.

DISCLAIMER: nu am mai scris sintaxa pascal de 2 ani asa ca nu sunt raspunzator ptr nici o greseala de sintaxa din acest post :P

[later edit] A treia observatie ar trebui putin editata ptr ca felul in care e scrisa akuma se intelege ca 0 e diferit de 1 (lucru care e destul de evident) si nu ca 0 factorial e 1.


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 06, 2007, 09:53:36
Da asa faceam. Dar pt a descompune un numar in puteri de-ale lui 3 cum mai fac? ca banuiesc ca nu mai e buna ideea care ai spus-o


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 06, 2007, 09:54:31
deci eu am facut asa:             
while p mod k=0 do
begin
        inc(nrdiv);
        p:=p div k;
end;

dar pt k=3 nu mai merge chestia cu biti nu?


Titlul: Răspuns: 051 Pascal
Scris de: Savin Tiberiu din Mai 06, 2007, 10:14:37
nu nu mai merge.


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 06, 2007, 10:29:56
Am facut pt 2 asa cum mi-ai spus:
while j AND 1=0 do
begin
       inc(nrdiv);
       j:=j shr 2;
end;
si mi se blocheaza programul. ce nu e bin3?


Titlul: Răspuns: 051 Pascal
Scris de: Andrei Homorodean din Mai 06, 2007, 10:43:41
Vezi ca trebuie sa faci shr un singur bit, nu doi. Vezi ca scrie mai sus ce face fiecare. Baga-te cu watch, poate nu e de la secventa aia.


Titlul: Răspuns: 051 Pascal
Scris de: Trifan Cristina din Mai 06, 2007, 11:08:02
Multumesc Homorodean pt observatie si tie Devilkind!
Acum am luat 100!


Titlul: Răspuns: 051 Pascal
Scris de: Florian Marcu din Mai 06, 2007, 13:13:54
Eu am ceva de genu` asta:

Cod:

while(x&1==0)
{
jj++;
x=x>>1;
}

Nu mi se executa niciodata, iar x-ul sigur e par...in watch x&1 imi apare 0, insa nu se executa... :-k Oare ce o avea?

{Edit later} M-am uitat mai sus pe forum si mi-am dat seama k nu folosisem paranteze... :aha:


Titlul: Răspuns: 051 Pascal
Scris de: Taloi Bogdan Cristian din Iunie 08, 2009, 15:49:19
De ce nu pot sa vad "imaginile" din solutia oficiala? :-s Are ceva calculatorul meu sau e un bug? :fighting:
Ce scrie in imaginile alea?


Titlul: Răspuns: 051 Pascal
Scris de: Paul-Dan Baltescu din Iunie 08, 2009, 16:04:44
Nu e de la tine. Probabil acele imagini s-au pierdut cand a fost mutat site-ul.


Titlul: Răspuns: 051 Pascal
Scris de: Constantinescu Adrian din Martie 03, 2014, 22:21:22
nu inteleg de ce primesc la unele teste Killed by signal 8(SIGFPE).

pentru calculare linie folosesc formula data
a=fact(n)/(fact(n-j)*fact(j));

pentru factorial folosesc
for(int b=1; b<=n; b++)
            sum=sum*b;

am inteles ca eroare este data de o impartire la 0 sau la un overflow? cum sa dea overflow cand prima formula este indicata in enunt si trebuie folosita, iar factorialul este factorial... nu stiu un alt mod de a il calcula.

variabilele sunt de tip long. care sa fie buba?