•pauldb
|
 |
« : Mai 10, 2010, 07:57:50 » |
|
Aici puteti discuta despre problema Produs.
|
|
|
Memorat
|
Am zis 
|
|
|
•Bogdan_tmm
|
 |
« Răspunde #1 : Mai 13, 2010, 13:18:29 » |
|
daca faci operatii pe numere mari astfel: st=dr=1; a=1;//a nr mare cat timp nu e sol { daca a==numar break; daca a<numar a=a*(++dr); altfel a=a/(st++); }
Dupa parerea mea solutia asta are complexitate O(10 000 * 100 000) aproximativ 1 miliard, dar ia 30p. O optimizare ar fi sa transform numerele intr-o baza mai mare ca sa aibe mai putine cifre dar nu stiu cum. Any help?
|
|
|
Memorat
|
|
|
|
•DraStiK
|
 |
« Răspunde #2 : Mai 13, 2010, 14:28:58 » |
|
Poti obţine 80p daca logaritmezi numărul, dar nu stiu cum ai putea obţine 100p. 
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
 |
« Răspunde #3 : Mai 13, 2010, 22:02:00 » |
|
Si cum anume logaritmezi un numar mare? Marind baza nu ajuta? L.E. am aflat 
|
|
« Ultima modificare: Mai 13, 2010, 22:15:01 de către Tarca Bogdan »
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #4 : Mai 16, 2010, 12:35:21 » |
|
Se poate obtine 100p pe ideea lui Dragos, doar ca trebuie o baza mai mare, gen 104.
|
|
|
Memorat
|
|
|
|
•airineiv
Strain
Karma: 1
Deconectat
Mesaje: 12
|
 |
« Răspunde #5 : Mai 24, 2010, 15:20:59 » |
|
Cum se poate logaritma un numar foarte mare? Formula loga(b*c) = logab + logac nu ajuta.
Any help?
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
 |
« Răspunde #6 : Mai 25, 2010, 12:13:43 » |
|
Sti ca numarul ala foarte mare e format astfel n*(n+1)*(n+2)*...*(n+m) unde 1<=n<=n+m<=100000 deci sti ca factorii primi sunt mai mici ca 100000 si astfel poti logaritma numarul ala mare
|
|
|
Memorat
|
|
|
|
•airineiv
Strain
Karma: 1
Deconectat
Mesaje: 12
|
 |
« Răspunde #7 : Mai 25, 2010, 22:35:44 » |
|
Multumesc pentru raspuns. Am reusit sa logaritmez numarul ala mare dar nu obtin decat 80 de puncte, chiar daca logaritmez intr-o baza mai mare (100000 = 10e5).  Dau mai jos un fragment din codul meu: #define EPS 1e-6 #define LN10e5 11.512925464970228420089957273422
int Sgn(double logA, double logN) { if(logA - logN < -EPS) return -1; else if(logA - logN > EPS) return 1; return 0; } unsigned int st=2, dr=1; double logA = 0.0; bool ok = false; while(!ok) { switch(Sgn(logA, logN)) { case 0: ok = true; break; case -1: dr++; logA += log((double)dr) / LN10e5; break; case 1: logA -= log((double)st) / LN10e5; st++; break; default: break; } }
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #8 : Mai 26, 2010, 09:04:10 » |
|
Incearca sa faci toate operatiile intr-o baza mai mare, poate asa merge .
|
|
|
Memorat
|
|
|
|
•airineiv
Strain
Karma: 1
Deconectat
Mesaje: 12
|
 |
« Răspunde #9 : Mai 26, 2010, 09:37:20 » |
|
Multumesc pentru raspuns, dar se pare ca nu ajuta asa mult marirea bazei. Am logaritmat chiar si in baza 10^50 (am folosit log10 ca logaritm in baza 10 si am impartit la 50, conform formulei de schimbare a bazei pentru logaritm).
Ultimele 2 teste pica testul de timp.
|
|
|
Memorat
|
|
|
|
•victor.ionescu
Strain
Karma: -5
Deconectat
Mesaje: 12
|
 |
« Răspunde #10 : Mai 26, 2010, 18:11:50 » |
|
Eu in concurs logaritmam numarul mare si apoi cautam binar pentru fiecare inceput. Am luat 80. Dar nu baza logaritmului era problema la mine, ci baza in care tineam numarul mare. Tu in ce baza tii numarul mare atunci cand il descompui in factori primi?
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #11 : Mai 26, 2010, 19:54:27 » |
|
A reusit, cu baza 104 e suficient ( si cred ca si la limita ) sa iei 100 pct.
|
|
|
Memorat
|
|
|
|
•victor.ionescu
Strain
Karma: -5
Deconectat
Mesaje: 12
|
 |
« Răspunde #12 : Mai 26, 2010, 21:08:41 » |
|
bun 
|
|
|
Memorat
|
|
|
|
•airineiv
Strain
Karma: 1
Deconectat
Mesaje: 12
|
 |
« Răspunde #13 : Mai 26, 2010, 21:45:44 » |
|
Da, problema era la baza in care se tine numarul mare. Lua mult timp operatia de descompunere in factori primi a numarului mare, pentru ca foloseam baza 10. Multumesc pentru ajutor. 
|
|
|
Memorat
|
|
|
|
•R.A.R
Strain
Karma: -7
Deconectat
Mesaje: 37
|
 |
« Răspunde #14 : Mai 27, 2010, 20:45:15 » |
|
Imi poate spune cineva cum se logaritmeaza un numar mare ?Banuiesc ca se descompune in factori primi si va fi lg(nr) = p1*lg(f1)+p2*lg(f2)+..+pn*lg(fn)[fi = factorul i,pi = puterea la care apare factorul i in descompunere].Daca e asa,nu vor fi probleme cu 'precizia' ?
|
|
|
Memorat
|
|
|
|
•alexandru92
|
 |
« Răspunde #15 : Mai 28, 2010, 11:04:09 » |
|
lg(nr)=numaru de cifre-1 ( lg=logaritm in baza 10 )
|
|
|
Memorat
|
|
|
|
•R.A.R
Strain
Karma: -7
Deconectat
Mesaje: 37
|
 |
« Răspunde #16 : Mai 30, 2010, 10:39:04 » |
|
Am logaritmat numarul insa niciodata L == P chiar daca valorile sunt aceleasi. while(L!=P) { if(L<P) L+=log10(++x); else L-=log10(++y); }
La valorile 5-8 ( cand ar trebui sa se opreasca), L = 2.52634 si P = 2.52634 insa imi cauta in continuare.
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #17 : Mai 30, 2010, 11:20:02 » |
|
Vezi ca poate nu compara bine, adica din cauza zecimalelor. Incearca sa lucri cu double, daca nu ai facut-o pana acum. In rest, nu stiu ce sa zic.
|
|
|
Memorat
|
|
|
|
•R.A.R
Strain
Karma: -7
Deconectat
Mesaje: 37
|
 |
« Răspunde #18 : Mai 30, 2010, 11:42:12 » |
|
Problema e ca nu compara bine.Am folosit double,am inmultit cu puteri ale lui 10 pentru a elimina zecimalele dar lafel.
|
|
|
Memorat
|
|
|
|
•gcosmin
|
 |
« Răspunde #19 : Mai 30, 2010, 11:45:34 » |
|
Problema se poate rezolva si fara a folosi logaritmi, deci merge pe int fara erori de precizie. Solutia se foloseste de descompunerea in factori primi a numarului P si a numerelor posibile care pot aparea in produs (adica 1...100 000).
|
|
« Ultima modificare: Mai 30, 2010, 11:51:19 de către Gheorghe Cosmin »
|
Memorat
|
|
|
|
•Bogdan_tmm
|
 |
« Răspunde #20 : Mai 30, 2010, 11:59:59 » |
|
Mai precis? Impartirea lui P la fiecare factor prim (de putere_factor ori) iese din timp...
|
|
|
Memorat
|
|
|
|
•devilkind
|
 |
« Răspunde #21 : Mai 30, 2010, 12:22:07 » |
|
Nu chiar. Gandeste ca ai de facut log2(N) + log3(N) + log5(N) + ... logP(N) impartirii (iar asta e un upper bound grosolan rau de tot) care in orice caz nu e foarte mare.
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #22 : Iunie 08, 2010, 14:22:44 » |
|
1. Trebuie sa citesti numarul in ordine inversa. Ex: numarul 123456789123456789 va fi , dupa transformare, asa ( in vectorul v de la 1 -> 5 ) : 6789 2345 7891 3456 12 . Adica v[1] = 6789, v[2] = 2345 .... 2. Citeste subiectele propuse pana acum, sigur o sa te ajute.
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #23 : Iunie 09, 2010, 07:13:06 » |
|
Subiectele din acest topic.
|
|
|
Memorat
|
|
|
|
•adysnook
Strain
Karma: 1
Deconectat
Mesaje: 6
|
 |
« Răspunde #24 : Mai 29, 2012, 12:08:39 » |
|
Dupa ce am implementat si eu o solutie, 30p, si am citit comentariile, tot nu ma prind cum sa iau 100p.  Cum logaritmez P? e vorba de aproximari?
|
|
|
Memorat
|
|
|
|
|