infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva educationala => Subiect creat de: Filip Cristian Buruiana din Martie 01, 2008, 15:35:33



Titlul: 012 Ridicare la putere in timp logaritmic
Scris de: Filip Cristian Buruiana din Martie 01, 2008, 15:35:33
Aici puteti discuta despre problema Ridicare la putere in timp logaritmic (http://infoarena.ro/problema/lgput).


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Serban Andrei Stan din Martie 01, 2008, 17:31:53
O alta problema care seamana cu asta e "modulo".


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Filip Cristian Buruiana din Martie 01, 2008, 22:44:16
De fiecare data cand aveti o problema asemanatoare, adaugati-o chiar voi in enunt :ok:.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Ionescu Robert Marius din Martie 01, 2008, 22:56:11
se uita si cineva peste sursa mea sa-mi zica ce gresesc :(
LE: am pus un /2 in plus :D


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Paul-Dan Baltescu din Martie 01, 2008, 22:57:09
Citat
De fiecare data cand aveti o problema asemanatoare, adaugati-o chiar voi in enunt.

Enunturile problemelor nu pot fi modificate decat de admini si de cei care le-au creat. :)
[Later edit: ] Sau se poate. :P

Citat
se uita si cineva peste sursa mea sa-mi zica ce gresesc :(

Nu cred ca adopti cea mai buna atitudine. :P In concurs nu are cine sa-ti gaseasca greselile in surse. Eventual mai uita-te cum au facut altii si poate te prinzi ce gresesti.

Off topic:
Daca iti schimbi poza, iti dau un plus.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Ionescu Robert Marius din Martie 01, 2008, 23:03:56
nu schimb poza ..ca nu am de ce :D  :weightlift:


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Sima Cotizo din Martie 03, 2008, 22:20:52
Eu am bagat matricea scrisa de Cosmin in latex. Era ceva de genul:
Citat
(x y z)
(0 1 0)
(0 0 1)
si am transformat-o in ce e acum... ideea e ca eu cred ca e gresita : daca inmultesc matricea-linie (a[k-1],a[k-2],a[k-3]) cu matricea aia nu obtin (a[k], a[k-1], a[k-2]) cum zice enuntul, dar daca inmultesc cu matricea:
Citat
x 1 0
y 0 1
z 0 0
obtin ce trebuie... asta pe hartie cel putin... gresesc? :?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Cosmin Negruseri din Martie 04, 2008, 00:45:42
Inmultesti matricea A cu o coloana. Si matricea e
(x y z)
(1 0 0)
(0 1 0)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Sima Cotizo din Martie 04, 2008, 13:23:18
Am modificat-o  :ok: ce ziceam eu e echivalent :)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Mircea Pasoi din Martie 04, 2008, 13:34:52
Nu uita sa bagi si $ la formatarea variabilelor.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Mircea Pasoi din Martie 04, 2008, 19:32:02
Am modificat un pic la explicatii. In primul rand algoritmul lui Euclid nu e o metoda mai generala de a determina inversul modular, e pur si simplu alta metoda. Poti folosi teorema lui Fermat la fel de bine si cand p nu e prim (varianta originala e ceva de genu a^phi(n) = 1 (mod n) unde cmmdc(a, n) = 1). De asemenea, matricea A era gresita. Nu e bine sa se strecoare astfel de greseli cand o problema e deja in arhiva, deoarece lumea invata din start gresit.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Cosmin Negruseri din Martie 04, 2008, 23:49:21
Mircea chestia cu a^phi(n) = 1 mod n e o teorema diferita si se numeste teorema lui Euler. Deci era corect ca fata de ideea din mica teorema a lui Fermat, ideea din algoritmul lui Euclid extins rezolva o problema mai generala. Daca vrei explica-le si teorema lui Euler dar atunci mai trebuie sa calculezi si phi(n) (si asta ia O(sqrt(n)) timp ... ).

Matricea A nu era gresita daca inmulteai A cu o coloana nu cu o linie. Dar la inceput nu stiam cum se scrie o coloana in latex.

Am dat revert la changeurile tale, si am pus coloane in loc de linii pentru sirul a.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Tirca Bogdan din Martie 09, 2008, 09:33:54
Oare de ce primesc Killed by Signal sigsv (crek asa scrie)??? Se uita cineva si pe sursa mea? :'(


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Sima Cotizo din Martie 09, 2008, 09:41:32
Ce-mi sare in ochi este ca ar trebui sa citesti din "lgput.in" (ala e "L" mic) ... si sa scrii in "lgput.out"


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Tirca Bogdan din Martie 09, 2008, 10:33:52
DA  :rotfl: Eu crezusem ca e "i" mare  :rotfl: dar tot iau doar 10 p.Oricum ms.Acum nu mai am timp .Sper sa o fac de 100


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Belgun Dimitri Adrian din Martie 09, 2008, 14:23:48
incearca sa folosesti ca tip de date int64 daca faci in pascal sau long long daca faci in c/c++


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Bula Ionut din Martie 13, 2008, 18:42:27
e interesant ca functia pow() din <math> nu este eficienta


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: HighScore din Martie 13, 2008, 18:44:22
functia pow() eficienta...dar nu pentru cazurile in care ai nevoie de modulo la rezultat. Mai degraba e vorba ca nu iti da rezultatul corect, si nicidecum de timp.

P.S. cu pow() poti sa calculezi si destul de multi radicali de ordin superior


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Florian Marcu din Martie 13, 2008, 19:45:15
Din cate stiu eu, functia pow() nu are complexitate O(logB), ci O(B). Gresesc cumva?  ???


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Vladimir Oltean din Martie 13, 2008, 21:38:47
Din cate stiu eu, functia pow() nu are complexitate O(logB), ci O(B). Gresesc cumva?  ???

daca
functia pow() din <math> nu este eficienta
, inseamna ca ai dreptate


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Alina Ene din Martie 13, 2008, 21:50:28
Din cate stiu eu, functia pow() nu are complexitate O(logB), ci O(B). Gresesc cumva?  ???

Cel mai probabil este O(B) pentru ca pow() lucreaza cu doubles (pow(double, double)).


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Mircea Pasoi din Martie 13, 2008, 23:08:59
Ma indoiesc ca e O(B) fiindca B e real. Din cate stiu pow(a, b) este echivalent cu exp(b*log(a)) , dar habar n-am cum e implementat exp() :)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Cosmin Negruseri din Martie 13, 2008, 23:28:46
Parca functiile gen sin cos exp sqrt sunt calculate prin serii ce converg la numarul respectiv.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Alina Ene din Martie 14, 2008, 01:12:07
Nici eu nu stiu cum este implementata exp(x). Ma gandeam ca aproximeaza mantissa folosind primii cativa termeni din Taylor series pentru e^{x - n ln(2)}, unde n este exponentul (n = floor(x / ln(2))).


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Tandrau Alexandru din Martie 14, 2008, 11:53:51
Functia power (http://www.sgi.com/tech/stl/power.html) din STL este implementata in timp logaritmic.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Bula Ionut din Martie 14, 2008, 13:37:33
si ce punctaj obtine daca o implementezi in problema?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Andrei Grigorean din Martie 14, 2008, 13:50:07
Din cat m-am uitat pe testele problemei... cred ca iei 0 puncte :-s.

Rezultatul trebuie sa incapa pe double pentru a obtine raspunsul corect... si vad ca in toate testele trebuie sa ridici la o putere prea mare pentru ca acest lucru sa fie posibil.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Bula Ionut din Martie 14, 2008, 14:03:33
vorbesti despre implementarea cu power din STL sau de punctajul meu? eu incerc sa fac ceva cu exp(b*log(a)) ; dar se pare ca obtine 0 in comparatie cu cele 10 puncte ale functiei pow()...  am observat ca C/C++ are multe functii gata implementate  (si acum offtopic : are qsort() si bsearch() chiar in stdlib.h)  : )  mai stiti si altele?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Sima Cotizo din Martie 14, 2008, 15:53:56
Din cat m-am uitat pe testele problemei... cred ca iei 0 puncte :-s.

Rezultatul trebuie sa incapa pe double pentru a obtine raspunsul corect... si vad ca in toate testele trebuie sa ridici la o putere prea mare pentru ca acest lucru sa fie posibil.
Daca te referi la faptul ca va face overflow, desi trebuie sa returnezi rezultatul modulo ceva, poti folosi o anumita functie care "inmulteste" doua numere pe clasa T:

Citat
template <class T, class Integer, class MonoidOperation>
T power(T x, Integer n, MonoidOperation op);

Totusi , orice librarie incerc sa includ nu imi gaseste functia power... tin minte ca asa facea cand am incercat ceva de genul multi_hash... de la ce sa fie? ??? Am o sursa si sunt curios daca merge, dar nu stiu ce sa includ...


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Bogdan-Cristian Tataroiu din Martie 14, 2008, 16:30:11
Zice pe pagina aia ca nu e in standardul C++, ci doar o extensie SGI. multi_hashul nici nu stiu ce e :)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Tandrau Alexandru din Martie 14, 2008, 18:33:40
pentru a folosi functia power folosesti:

#include <ext/numeric>

using namespace std;
using namespace __gnu_cxx;

sper ca asa se scrie ultima dintre ele.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Sima Cotizo din Martie 14, 2008, 18:46:07
Zice pe pagina aia ca nu e in standardul C++, ci doar o extensie SGI. multi_hashul nici nu stiu ce e :)
Era o chestie cu "multi" care apare pe sgi dar nu e in standard si eu am cautat-o mult si bine, ca pe power  :?

pentru a folosi functia power folosesti:

#include <ext/numeric>

using namespace std;
using namespace __gnu_cxx;

sper ca asa se scrie ultima dintre ele.
Mi-a compilat :) Din cate tin minte, se include la ONI documentatia STL care seamana foarte mult cu cea de pe SGI, putem folosi chestii care apar in vreo biblioteca instalata, dar care nu sunt standard?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Bogdan-Cristian Tataroiu din Martie 14, 2008, 18:50:30
Pai daca esti sigur ca ai aceeasi versiune ca si comisia, nu are ce sa se intample. Nefiind standard nu prea cred ca e bine sa le incerci :) E mult mai posibil sa se schimbe de la o versiune de gcc la alta.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Tudorica Constantin Alexandru din Martie 25, 2008, 18:49:49
Din cat m-am uitat pe testele problemei... cred ca iei 0 puncte :-s.

Rezultatul trebuie sa incapa pe double pentru a obtine raspunsul corect... si vad ca in toate testele trebuie sa ridici la o putere prea mare pentru ca acest lucru sa fie posibil.
Defapt cred ca iei 10 puncte unul din teste intra pe unsigned int in borland asa ca ar trebui sa iti mearga pentru testul 8.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: E1 La5c01 din Mai 18, 2008, 13:02:10
va rog mult spuneti-mi ce sa fac ca sa-mi mearga si la mine p calculator int64 pt ca la mine nu merge...iar la aceasta problema am obtinut 100 dupa ce am declarat variabilele de tip int64..va roog mult :sad: :?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Sima Cotizo din Mai 18, 2008, 14:10:31
Instaleaza-ti free pascal si lucreaza in el: :)

http://sourceforge.net/project/downloading.php?group_id=2174&use_mirror=switch&filename=fpc-2.2.0.i386-win32.exe&97921904


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: E1 La5c01 din Mai 18, 2008, 14:13:56
mersi  :ok:


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Florin Marius Popescu din Martie 21, 2009, 04:12:13
salut... am si eu o nelamurire ... cum doamne iartama declar variabila ''n'' in   pascal sau cum o citesc , cum o retin ... la fel si pentru 'p'. in pascal tipul longint suporta intregi pana la 2 miliarde..... sa l citesc cu caractere oare?  :-k habar nu am..... m-am uitat pe sursa de 100 de puncte dar nu stiu c++  :'( :'( :'(  si nu am priceput nimica... ajutati ma va rog mult ms...     sunt multe chestii din limbajul pascal pe care nu le stiu... referitor la cum e mai avantajos d.p.d.v. al timpului de executie sa folosesti functiile, sa declari variabile care sa ocupe putin, pt ca daca vrei sa scoti un timp bun tre sa sti sa optimizezi programul la nivel de limbaj si apoi la nivel de algoritm... Noi la scoala facem info in pascal... dar trebuia sa eu sa invat c++ intr-o vacanta de vara, acum sunt cu bacu, admitere si nu prea e timp  :)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: zloteanu adrian nichita din Mai 26, 2009, 11:23:47
salut... am si eu o nelamurire ... cum doamne iartama declar variabila ''n'' in   pascal sau cum o citesc , cum o retin ... la fel si pentru 'p'. in pascal tipul longint suporta intregi pana la 2 miliarde..... sa l citesc cu caractere oare?  :-k habar nu am..... m-am uitat pe sursa de 100 de puncte dar nu stiu c++  :'( :'( :'(  si nu am priceput nimica... ajutati ma va rog mult ms...     sunt multe chestii din limbajul pascal pe care nu le stiu... referitor la cum e mai avantajos d.p.d.v. al timpului de executie sa folosesti functiile, sa declari variabile care sa ocupe putin, pt ca daca vrei sa scoti un timp bun tre sa sti sa optimizezi programul la nivel de limbaj si apoi la nivel de algoritm... Noi la scoala facem info in pascal... dar trebuia sa eu sa invat c++ intr-o vacanta de vara, acum sunt cu bacu, admitere si nu prea e timp  :)
pe infoarena limitele sunt mult mai mari... :weightlift: :weightlift:
tu fa cum crezi ca e mai bine si apoi trimite-o


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Tandrau Alexandru din Mai 26, 2009, 11:51:51
daca vrei sa scoti un timp bun tre sa sti sa optimizezi programul la nivel de limbaj si apoi la nivel de algoritm

Cu asta nu prea ai dreptate. In ziua de azi, compilatoarele moderne fac o treaba excelenta referitor la optimizarea limbajului. In momentul de fata tu scrii cod (C/Pascal nu conteaza) care trece printr-un compilator care are grija sa fie foarte optimizat pentru arhitectura respectiva. Au trecut de mult vremurile in care scriai cod in instructiuni de procesor (atunci conta mult mai mult optimizarea la nivel de limbaj).

Acum, singurul lucru pe care nu-l stie compilatorul e sa-ti modifice tie algoritmul. Gandeste-te un pic care e diferenta intre un algoritm O(N^2) si O(N) (de exemplu). N^2 va dura aproximativ N^2 * C , iar N va dura N * C, unde C e o constanta care reprezinta durata medie de executie a unei instructiuni de limbaj (C/C++) inmultita cu un nr de instructiuni care sunt repetate. C-urile astea sunt aproximativ egale (in O(N^2) si O(N)) si nu prea ai multe variante de a optimiza aici (cum ti-am zis compilatorul face treaba). Asa ca.. O(N^2) va merge de aproximativ N ori mai incet decat O(N).. iti dai seama ce inseamna asta pt N = 100.000 sa zicem?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Usurelu Catalin din August 02, 2009, 13:53:54
Stie cineva de ce pe calculator imi da eroare SIGFPE iar pe infoarena nu ? mi se intampla doar daca declar long long functia (stiu ca merge si doar long, dar de ce pe infoarena merge si la mine nu?).  O avea vreo legatura ca folosesc windows si pe infoarena se foloseste linux sau asa ceva ?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: A Cosmina - vechi din August 02, 2009, 13:56:51
Uite ce am gasit legat de eroarea ta: http://en.wikipedia.org/wiki/SIGFPE .  :?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Usurelu Catalin din August 02, 2009, 21:58:36
Pai nu ma ajuta cu nimic asta. Stiu ce inseamna eroarea doar ca nu se potriveste in cazul meu.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Emanuel Cinca din August 02, 2009, 22:05:30
Spune si ce compilator folosesti si IDE. Eu cu MinGW din packul de pe infoarena nu am avut niciodata probleme de genul asta.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Usurelu Catalin din August 03, 2009, 13:52:49
Pai treaba e ca si eu tot mingw de pe infoarena folosesc. Ma gandesc ca o fi vreo eroare de-a lui mingw ca am observat ca dupa un timp face faze. Daca mai face ceva vad eu....


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Pripoae Teodor Anton din August 03, 2009, 14:54:42
Pune-ti Ubuntu, iti va rezolva problema :P.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Andrei Misarca din August 03, 2009, 15:08:34
Pune-ti Ubuntu, iti va rezolva problema :P.
Nu cred ca merita instalat Ubuntu doar pentru ca nu merge MingW. Incearca si alte IDE-uri, gen Code::Blocks sau DevCpp. Insa incearca sa reinstalezi Mingw, intrucat mie mi s-a parut destul de bun si (cat l-am folosit) nu mi-a facut figuri.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Pripoae Teodor Anton din August 03, 2009, 19:40:34
Eu sincer am avut multe probleme cu MinGW cand eram pe Windows de aceea nu recomand.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: S. Alex din Februarie 08, 2010, 16:17:29
O mica/mare nelamurire.. compilez in MinGW o sursa.. primesc valori aiurea.. se comporta ciudat ..( o functie care intra pe o ramura de return 1 returneaza 0 sau valori aiurea sau nush ) .. si am observat ca daca schimb long long-urile in long-uri sau ma rog ... atunci merge.. insa sursa este de 100 de puncte ( noroc ca am incercat sa o trmit sa vad ). Deci nu merge long long-u in MinGW altfel nu imi pot explica, pt ca atunci cand declar long cele 2-3 variabile.. merge brici .. chiar nu inteleg.. de ce sa nu mearga long long-u? eroare nu da.. prin urmare? care-i faza? ms anticipat, chiar astept un raspuns ca  ](*,) sursa e ultima trimisa ( nu cred c-o sa fie mare activitate la problema asta deci o gasiti usor  :D )


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Mircea Dima din Februarie 08, 2010, 16:31:40
O mica/mare nelamurire.. compilez in MinGW o sursa.. primesc valori aiurea.. se comporta ciudat ..( o functie care intra pe o ramura de return 1 returneaza 0 sau valori aiurea sau nush ) .. si am observat ca daca schimb long long-urile in long-uri sau ma rog ... atunci merge.. insa sursa este de 100 de puncte ( noroc ca am incercat sa o trmit sa vad ). Deci nu merge long long-u in MinGW altfel nu imi pot explica, pt ca atunci cand declar long cele 2-3 variabile.. merge brici .. chiar nu inteleg.. de ce sa nu mearga long long-u? eroare nu da.. prin urmare? care-i faza? ms anticipat, chiar astept un raspuns ca  ](*,) sursa e ultima trimisa ( nu cred c-o sa fie mare activitate la problema asta deci o gasiti usor  :D )

Daca ai probleme la afisarea, incearca sa afisezi cu streamuri:

long long s = 1000000000000123456LL;

cout<<s;


Eu cand sunt pe Windows lucrez pe MingW si nu am probleme! (lucrez de vreo 5 ani)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: alexandru din Februarie 08, 2010, 17:39:26
O mica/mare nelamurire.. compilez in MinGW o sursa.. primesc valori aiurea.. se comporta ciudat ..( o functie care intra pe o ramura de return 1 returneaza 0 sau valori aiurea sau nush ) .. si am observat ca daca schimb long long-urile in long-uri sau ma rog ... atunci merge.. insa sursa este de 100 de puncte ( noroc ca am incercat sa o trmit sa vad ). Deci nu merge long long-u in MinGW altfel nu imi pot explica, pt ca atunci cand declar long cele 2-3 variabile.. merge brici .. chiar nu inteleg.. de ce sa nu mearga long long-u? eroare nu da.. prin urmare? care-i faza? ms anticipat, chiar astept un raspuns ca  ](*,) sursa e ultima trimisa ( nu cred c-o sa fie mare activitate la problema asta deci o gasiti usor  :D )
Am vazut ca lucrezi in "c" .
Inlocuieste %lld cu %I64d .


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Mircea Dima din Februarie 08, 2010, 20:30:31
O mica/mare nelamurire.. compilez in MinGW o sursa.. primesc valori aiurea.. se comporta ciudat ..( o functie care intra pe o ramura de return 1 returneaza 0 sau valori aiurea sau nush ) .. si am observat ca daca schimb long long-urile in long-uri sau ma rog ... atunci merge.. insa sursa este de 100 de puncte ( noroc ca am incercat sa o trmit sa vad ). Deci nu merge long long-u in MinGW altfel nu imi pot explica, pt ca atunci cand declar long cele 2-3 variabile.. merge brici .. chiar nu inteleg.. de ce sa nu mearga long long-u? eroare nu da.. prin urmare? care-i faza? ms anticipat, chiar astept un raspuns ca  ](*,) sursa e ultima trimisa ( nu cred c-o sa fie mare activitate la problema asta deci o gasiti usor  :D )
Am vazut ca lucrezi in "c" .
Inlocuieste %lld cu %I64d .

Bravo Alexandru!... E printre putinele posturi bune ale tale!...Incearca sa postezi mai rar... dar sa fie la fel ca asta, si o sa-ti creasca karma!.
Ai un + de la mine!

Eu am incercat L64D si l64d si nu mergeau (stiam eu ca e ceva de genul)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Pripoae Teodor Anton din Februarie 08, 2010, 23:02:34
Eu recomand afisarea cu streamuri, pt ca este standard, si va merge la fel pe orice compilator. Daca lucrezi in c, si totusi vrei sa iti mearga si pe mingw si pe linux acelasi cod, fa asa:

Cod:
long long x = 3390198353949LL;

#ifdef __MINGW32__
    printf("%I64d\n", x);
#else
    printf("%lld\n", x);
#endif

Sunt define-uri din care preprocesorul va alege unul din ele in functie de compilator.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Alexandru Gherghe din Ianuarie 12, 2011, 09:57:07
as putea cu acest algoritm sa ridic o permutare sigma la puterea k?


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Florian Marcu din Ianuarie 12, 2011, 10:24:51
Da. Si iese N * log(K), unde N e ordinul permutarii.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: c a e n din Aprilie 23, 2011, 02:11:38
Eu am luat 100 de puncte la problema asta folosind
Cod:
if(e == 1) return n; // daca avem n^e, iar e = 1, returneaza n
. Apoi am vrut sa rezolv problema paritate (http://infoarena.ro/problema/paritate) folosind functia mea de exponentiere rapida in loc de pow-ul din math.h pe care il foloseam inainte. Insa luam Memory Limit Exceeded pe toate testele, iar la mine pe calculator Segmentation Fault. Dupa multe schimbari la cod, am modificat linia scrisa mai sus in
Cod:
if(!e) return 1; // daca avem n^e, iar e = 0, returneaza 1
si a mers. Imi poate explica cineva care ar fi diferenta dintre cele doua versiuni (in afara de cea evidenta ca una se opreste la 1, iar cealalta la 0)? Multumesc!


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Savin Tiberiu din Aprilie 23, 2011, 08:54:48
 E posibil la un moment sa sari peste e=1 si sa ajungi direct la e=0. E cam greu sa imi dau seama de ce se intampla acest lucru fara codul functiei, ca sa vad cum faci impartirea sa iti pot da un exemplu.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: c a e n din Aprilie 23, 2011, 13:51:59
Codul care nu functiona la problema paritate este acesta
Cod:
#include <stdio.h>
#include <string.h>

#define IN "paritate.in"
#define OUT "paritate.out"
#define M 60000
#define N M * 8

static char sir[N];
static char text[M];

static int baza_doi(int); /* Conversie in baza 2 */
static int exp1(int, int); /* Exponentiere rapida */

int main(void) {

    long len, i;
    int b_par, j, unu;
    char ok = 1, paritate;

    (void) freopen(IN, "r", stdin);
    (void) freopen(OUT, "w", stdout);

    fgets(sir, N, stdin);
    len = strlen(sir);

    for(i = 0; i < len >> 3; ++i) {

        b_par = i << 3;
        if(sir[b_par] == '1') paritate = 1;
        else paritate = 0;

        for(j = 1, unu = 0; j < 8; ++j) {

            if(sir[b_par + j] == '1') ++unu;
        }

        if(unu % 2 == paritate) text[i] = baza_doi(b_par);
        else ok = 0, text[i] = 0;
    }

    if(ok) {

        printf("DA\n");
        for(i = 0; i < len >> 3; ++i) printf("%c", text[i]);
    } else {

        printf("NU\n");
        for(i = 0; i < len >> 3; ++i) if(!text[i]) printf("%ld ", i);
    }

    return 0;
}

int baza_doi(int start) {

    int j, rez = 0;

    for(j = 7; j > 0; --j) if(sir[start + j] == '1') rez += exp1(2, 7 - j);

    return rez;
}

int exp1(int n, int e) {

    int rez;

    if(e == 1) return n;

    rez = exp1(n, e >> 1);
    rez *= rez;
    if(e & 1) rez *= n;

    return rez;
}


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Oncescu Costin din Mai 08, 2012, 20:35:53
Imi poate spune si mie cineva cum se face Nice Patterns Strike Back ca nu imi vine nici o idee :horsy:


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Visan Radu din Mai 08, 2012, 21:53:50
La problema aia din cate am vazut aici (http://infoarena.ro/forum/index.php?topic=2565.0) trebuie sa ridici o matrice la putere in timp logaritmic. Probabil intrebi cum ridici rapid matricea la putere, asa ca te poti folosi de "Al k-lea termen Fibonacci" din Arhiva Educationala, acolo trebuie sa faci asta.



Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Cretu Bogdan din Iulie 01, 2013, 23:45:07
Puteti sa-mi dati si mie, va rog, un exemplu de teste pentru care sursa aceasta pica???
Cod:
#include <iostream>
#include <fstream>
#define MOD 1999999973
using namespace std;
ifstream f("lgput.in");
ofstream g("lgput.out");
int n,p;
int powmodulo ()
{
    int b=1;
    while (p)
    {
        if ((p&1))
        {
            b=((b%MOD)*(n%MOD))%MOD;
            p--;
        }
        n=((n%MOD)*(n%MOD))%MOD;
        p=(p>>1);
    }
    return b;
}
int main ()
{
    f>>n>>p;
    g<<powmodulo();
}
Chiar am incercat multe exemplu si toate imi dau bine.
Multumesc.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Rares Cheseli din Iulie 02, 2013, 00:44:25
Puteti sa-mi dati si mie, va rog, un exemplu de teste pentru care sursa aceasta pica???
Cod:
#include <iostream>
#include <fstream>
#define MOD 1999999973
using namespace std;
ifstream f("lgput.in");
ofstream g("lgput.out");
int n,p;
int powmodulo ()
{
    int b=1;
    while (p)
    {
        if ((p&1))
        {
            b=((b%MOD)*(n%MOD))%MOD;
            p--;
        }
        n=((n%MOD)*(n%MOD))%MOD;
        p=(p>>1);
    }
    return b;
}
int main ()
{
    f>>n>>p;
    g<<powmodulo();
}
Chiar am incercat multe exemplu si toate imi dau bine.
Multumesc.

Pune variabilele si functia long long si o sa mearga  :ok:


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Cretu Bogdan din Iulie 02, 2013, 02:30:34
Uff...si cat am mai rasucit sursa xD.
Multumesc din nou ^_^  =D&gt;


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Bodnariuc Dan Alexandru din Octombrie 31, 2013, 16:47:24
http://www.infoarena.ro/job_detail/1019598

cum de ia sursa asta 100 p?? adica aici fac o(n) operatii de inmultire ,miam dat seama deaba cand am rezolvat problema al k-lea termen fibonacii, si la invers modular din arhiva tot 100 iau cu acelasi algorithm gresit.

oare compilatoru imi optimizeaza programul?? nu prea intaleg dc totusi imi ruleaza asa repede


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: George Marcus din Octombrie 31, 2013, 19:13:51
oare compilatoru imi optimizeaza programul?

Se pare ca da (http://stackoverflow.com/questions/14509628/do-compilers-automatically-optimise-repeated-calls-to-mathematical-functions).


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Lup Vasile din Februarie 14, 2014, 20:56:57
Imi puteti explica va rog si mie solutia oficiala? Am inteles ideea astfel incat sa implementez algoritmul recursiv, dar nu inteleg cum functioneaza solutia oficiala.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Eftime Andrei Horatiu din Februarie 15, 2014, 20:39:59
Ideea e ca n^k = n*n*...*n si asta are complexitate o(k).In sursa oficiala ei ii gasesc reprezentarea binara a lui k si scriu acel pordus sub forma mai multor produse de tipul n^(2^x),din cate poti vedea daca bitul x este 1,inmultesc produsul cu n^(2^x), iar toate aceste produse se genereaza in timp logaritmic, adica avem complexitate o(log k), ceea ce in multe probleme poate face diferenta.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Jacobsen Iandru din Ianuarie 07, 2017, 14:53:13
Imi poate explica cineva de ce nu imi functioneaza codul?
http://www.infoarena.ro/job_detail/1842699 (http://www.infoarena.ro/job_detail/1842699)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Alexandru Valeanu din Ianuarie 07, 2017, 21:39:54
Ar trebui sa calculezi si rezultatele intermediare modulo m.


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Jacobsen Iandru din Ianuarie 07, 2017, 21:49:26
Imi da la fel.

http://www.infoarena.ro/job_detail/1842980?action=view-source (http://www.infoarena.ro/job_detail/1842980?action=view-source)


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Alexandru Valeanu din Ianuarie 07, 2017, 23:04:14
Unde conteaza tot nu pui modulo (eg n*n).


Titlul: Răspuns: 012 Ridicare la putere in timp logaritmic
Scris de: Jacobsen Iandru din Ianuarie 07, 2017, 23:55:54
Appreciated  :thumbup: