|
Titlul: 483 Maxd Scris de: Adrian Diaconu din August 14, 2007, 10:12:05 Aici puteţi discuta despre problema Maxd (http://infoarena.ro/problema/maxd).
Titlul: Răspuns: 483 Maxd Scris de: Ionescu Vlad din August 20, 2007, 20:14:43 Vad ca sunt multe solutii care intra lejer in timp... cum aflati cati divizori are un numar? Eu fac fara ciur in O(sqrt(nr)) si nu intra in timp...
Sa calculez cu ciurul atatea numere prime iarasi nu cred ca ar intra in timp... deci ce mai ramane? Titlul: Răspuns: 483 Maxd Scris de: Bondane Cosmin din August 20, 2007, 20:26:34 Intra in timp daca iti calculezi cu erast. numerele prime, dupa care sa faci descompunerea in factori primi in sqrtN. De aici te descurci :P. In total iti vine undeva la O(N*sqrtN + N*sqrtN).
Titlul: Răspuns: 483 Maxd Scris de: Ionescu Vlad din August 20, 2007, 20:52:40 Da... a intrat :)
Multumesc! Titlul: Răspuns: 483 Maxd Scris de: Farcasanu Alexandru Ciprian din Ianuarie 13, 2008, 14:05:17 Pf....nu am inteles cum se face din e ziceti voi acolo...eu sunt clasa a 9a asa ca nu inteleg ce e O(log(...)) .. eu am pus intr-un vector toate numerele prime mai mici ca 2 milioane....si apoi am luat fiecare numar din intervalul [a,b] si l-am descompus in factori primi, am retinut puterile si am aplicat nrdiv=(1+p1)(1+p2)...(1+pr) unde p1..pr sunt puterile factorilor primi......si de aici ati inteles......dar iau KBS 11........care e varianta optima de rezolvare?
Titlul: Răspuns: 483 Maxd Scris de: Andrei Popescu din Ianuarie 13, 2008, 15:13:57 Pf....nu am inteles cum se face din e ziceti voi acolo...eu sunt clasa a 9a asa ca nu inteleg ce e O(log(...)) .. eu am pus intr-un vector toate numerele prime mai mici ca 2 milioane....si apoi am luat fiecare numar din intervalul [a,b] si l-am descompus in factori primi, am retinut puterile si am aplicat nrdiv=(1+p1)(1+p2)...(1+pr) unde p1..pr sunt puterile factorilor primi......si de aici ati inteles......dar iau KBS 11........care e varianta optima de rezolvare? Declarand un vector atat de mare, tu depasesti cu mult memoria alocata acestei probleme. Pentru a genera solutia este nevoie doar de valorile dintr-un anumit interval. Incearca sa tii cont de chestia asta in rezolvare. Bafta! Titlul: Răspuns: 483 Maxd Scris de: HighScore din Ianuarie 13, 2008, 19:08:11 in teste e inclus si cell mai prost caz(adica de la 1.999.980.000 la 2 miliarde)?? ca la mine pe calc la testu ala ia peste 0.5, iar pe site vad ca nu depasesc 52ms
Titlul: Răspuns: 483 Maxd Scris de: Florian Marcu din Ianuarie 14, 2008, 09:09:30 in teste e inclus si cell mai prost caz(adica de la 1.999.980.000 la 2 miliarde)?? ca la mine pe calc la testu ala ia peste 0.5, iar pe site vad ca nu depasesc 52ms Nu. Nu e inclus. Titlul: Răspuns: 483 Maxd Scris de: Alexandru Pana din Februarie 15, 2008, 13:40:54 Pf....nu am inteles cum se face din e ziceti voi acolo...eu sunt clasa a 9a asa ca nu inteleg ce e O(log(...)) .. eu am pus intr-un vector toate numerele prime mai mici ca 2 milioane....si apoi am luat fiecare numar din intervalul [a,b] si l-am descompus in factori primi, am retinut puterile si am aplicat nrdiv=(1+p1)(1+p2)...(1+pr) unde p1..pr sunt puterile factorilor primi......si de aici ati inteles......dar iau KBS 11........care e varianta optima de rezolvare? 1. hehe, in primul rand logaritmii se fac in a 10-a .. 2. http://infoarena.ro/ciurul-lui-erathostene Titlul: Răspuns: 483 Maxd Scris de: Vlad Schnakovszki din Decembrie 29, 2008, 12:16:41 Daca gaseste careva de ce imi da Declaration Syntax Error pe linia cu void delete ii dau o bere. ](*,) Stiu ca s-ar putea sa fie si alte erori da important e sa trec de asta. Mersi.
Cod: #include <stdio.h> Titlul: Răspuns: 483 Maxd Scris de: Gabriel Bitis din Decembrie 29, 2008, 12:29:25 "delete" e cuvant rezervat. Schimba numele functiei si ar trebui sa mearga.
Imi vreau berea! Titlul: Răspuns: 483 Maxd Scris de: Vlad Schnakovszki din Decembrie 29, 2008, 12:44:39 Aia era :aha:
Daca esti din Arad sau ne intalnim la vreun ONI iti fac 3 beri nu una :D Titlul: Răspuns: 483 Maxd Scris de: Flaviu Pepelea din Decembrie 29, 2008, 13:40:14 stii sa faci bere ? :D
Titlul: Răspuns: 483 Maxd Scris de: Vlad Schnakovszki din Decembrie 30, 2008, 12:41:57 Deci se pare ca problema asta nu vrea sa fie facuta ... Killed by signal 11(SIGSEGV) in toate testele. Am scos vectorul si tot aia imi da. Anyone know why?
Cod: #include <fstream.h> Titlul: Răspuns: 483 Maxd Scris de: Florian Marcu din Decembrie 30, 2008, 16:32:51 Nu m-am uitat foarte atent, dar cred ca de la " x[k*j-a]++; " se trage. Ai grija ce valori ai in k*j-a. Vezi sa nu fie niciodata negative, sau sa nu depaseasca 20000.
Titlul: Răspuns: 483 Maxd Scris de: Emanuel Cinca din Decembrie 30, 2008, 16:38:02 da...cum zice florian...incearca pentru b=2 000 000 000 si a=1 999 980 000...am facut de mana si parca incerci sa marchezi x[-a]...deci de acolo ti se trage KBS11
Titlul: Răspuns: 483 Maxd Scris de: Vlad Schnakovszki din Decembrie 30, 2008, 23:48:19 Deci pana la varianta asta am ajuns.
Cod: #include <fstream.h> Exact cand intra in for j=a/k. Daca inlocuim k*j-a=k*a/k-a=a-a=0. Sub zero nu ar avea cum sa scada. Ultima oara cand intra in for are valoarea j=b/k. Daca inlocuim k*j-a=k*b/k-a=b-a care se garanteaza in problema ca nu depaseste 20000. Deci matematic ar trebui sa mearga. Treaba ii ca si pe testul 200 200 mi se blocheaza in watch fix dupa acolada care inchide int mainu. Eu chiar nu reusesc sa-mi dau seama ce are ... Ma pricep si eu la erorile din C++ da deja cand ma umple de ferestre (am Borland 5 ca 3 nu merge :annoyed:) ma pierd. ](*,) Titlul: Răspuns: 483 Maxd Scris de: Emanuel Cinca din Decembrie 31, 2008, 00:42:48 acum ai schimbat putin functia divizori...dar iti explic de unde iti iesea x[-a]....
luam b=2 000 000 000 si a=1 999 980 000 in functia ta cu divizori i ajungea la b si il dadea ca parametru... a<b deci in c++ a/b=0 desi in matematica =0.(9) fiindca tu retii partea intreaga in int... int nu rotunjeste... eventual fa-ti o functie pentru a rotunji un numar... si atunci cum j=0, k*j-a=0-a=-a... sper ca ai inteles acum ce am vrut sa zic... acum un contraexemplu chiar si cu modificarea ta de i<=b/2... luam cazul a=1 si b= 20 001... acuma a<b/2... si mai departe se repeta... daca am gresit in exemple va rog sa spuneti ca totusi e o ora destul de tarzie, cea la care am postat :peacefingers: LE: pe scurt uiti cazul in care j incepe de la 0 si de acolo ti se buseste tot codul... scuze pentru tot romanul de dinainte... am zis sa-l las ca e si explicat cate ceva pe acolo :P Titlul: Răspuns: 483 Maxd Scris de: Bozianu Ana din Decembrie 31, 2008, 01:24:53 Chiar daca e putin probabil sa aiba legatura cu problema ta as vrea sa iti fac si eu doua recomandari. Prima ar fi sa nu folosesti aceeasi litera pentru o variabila (cazul lui k la tine) declarata global si un parametru de functie ( uneori poate sa iti induca anumite confuzii) iar a doua este sa nu abuzezi de functii asa cum faci tu in sursa ta cu functia marcheaza() Chiar daca nu e sursa KBS-ului tau, datorita consumului de timp cu apelurile, e posibil in unele cazuri sa iesi din timp si sa te trezesti cu TLE.
Titlul: Răspuns: 483 Maxd Scris de: speedzeal din Ianuarie 30, 2009, 20:44:18 Cine ma poate ajuta iau TLE pe 3 teste...De ce?.... ](*,)...fak ciur pana la 45000 si dupa aia fac descompunerea in factori primi in sqrt nr...
Cod: #include<iostream.h> Titlul: Răspuns: 483 Maxd Scris de: Vlad Schnakovszki din Februarie 14, 2009, 22:14:53 Deci din nou iau "Killed by Signal 11" pe 9 teste ... Am rescris tot programu pe alta idee si culmea tot acolo ajung ](*,)
Raman recunoscator daca imi zice cineva de ce imi da Signal 11, avand in vedere ca am incercat vectorii de toate dimensiunile. ](*,) Titlul: Răspuns: 483 Maxd Scris de: Florian Marcu din Februarie 15, 2009, 08:05:49 Tu mergi cu i pana la w inclusiv, dar pozitia w nu exista in vectorul v[], pentru ca declari v[w], ceea ce inseamna ca aloca memorie pt elementele 0,1,2 ... w-1. Deci declara vectorul v[w+3], ca sa fii sigur ca nu iesi din el. Si mai e si chestia asta:
Cod: for (j=i;j*i<=b;j++) Dupa cum probabil stii, b-ul este de 2 miliarde. Deci daca mergi cu i*j pana la 2 miliarde, e destul de logic ca nu ai vectorul v[] atat de mare. Mai baga acolo un " && i*j<=w ". Doar astea doua lucruri le-am observat. Fa modificarile, si probabil nu o sa mai iei KBS11. Titlul: Răspuns: 483 Maxd Scris de: Vlad Schnakovszki din Februarie 15, 2009, 13:59:37 Tu mergi cu i pana la w inclusiv, dar pozitia w nu exista in vectorul v[], pentru ca declari v[w], ceea ce inseamna ca aloca memorie pt elementele 0,1,2 ... w-1. Deci declara vectorul v[w+3], ca sa fii sigur ca nu iesi din el. Si mai e si chestia asta: Asa era, mersi :walkman:Cod: for (j=i;j*i<=b;j++) Dupa cum probabil stii, b-ul este de 2 miliarde. Deci daca mergi cu i*j pana la 2 miliarde, e destul de logic ca nu ai vectorul v[] atat de mare. Mai baga acolo un " && i*j<=w ". Doar astea doua lucruri le-am observat. Fa modificarile, si probabil nu o sa mai iei KBS11. Titlul: Răspuns: 483 Maxd Scris de: Chibici Tiberiu din Martie 11, 2009, 11:53:12 Sunt intr-a 9-a si n-am auzit de 'ciur'(??).
Dar am facut cum am stiut: Mi-a dat la 3 teste timp depasit, iar la restul a mers, cum pot sa optimizez? Cod: #include <fstream> Titlul: Răspuns: 483 Maxd Scris de: Sima Cotizo din Martie 11, 2009, 12:17:25 Daca nu ai invatat despre ciur, invata despre ciur :). Te vor ajuta problema din arhiva educationala (http://infoarena.ro/problema/ciur) si articolul despre ciur (http://infoarena.ro/ciurul-lui-eratostene).
Titlul: Răspuns: 483 Maxd Scris de: Dobra Iulia din Martie 13, 2009, 19:30:02 Mie imi ruleaza problema in c++... si functioneaza dar cand o trimit imi zice ca fisierul de iesire lipseste ](*,) .. nu pot sa inteleg de ce ... :'( ma puteti ajuta si pe mine...?
Titlul: Răspuns: 483 Maxd Scris de: Emanuel Cinca din Martie 13, 2009, 19:31:36 poate ai gresit numele fisierului de iesire... :)
Titlul: Răspuns: 483 Maxd Scris de: Dobra Iulia din Martie 13, 2009, 19:35:36 nu e gresit.. :? maxd.out e numele fisierului.. in c++ imi creeaza fisierul..
Titlul: Răspuns: 483 Maxd Scris de: Emanuel Cinca din Martie 13, 2009, 19:37:08 Si fisierul de intrare? Daca nu gasesti bug-ul, trimite-mi PM cu sursa si incerc sa te ajut. :peacefingers:
Titlul: Răspuns: 483 Maxd Scris de: Dobra Iulia din Martie 13, 2009, 19:43:21 ok.. mersi mult
Titlul: Răspuns: 483 Maxd Scris de: Alexandru-Iancu Caragicu din Aprilie 09, 2009, 17:23:42 Mie-mi da sqrt(4) = 895.
O fi de la MinGW, ca nu-i prea bine facut? Are un intreg istoric de probleme. Titlul: Răspuns: 483 Maxd Scris de: Andrei Grigorean din Aprilie 09, 2009, 17:49:16 Ai grija la afisare, functia sqrt e pe double (atat parametrul cat si valoarea returnata).
Titlul: Răspuns: 483 Maxd Scris de: Alexandru-Iancu Caragicu din Aprilie 09, 2009, 18:01:52 Nu-i vorba de afisare.
Ma refer in calculul din timpul programului. A trebuit sa scot din cod limita pana la radical. Programul nu-i asa de optim, dar daca nu merge sqrt... ce sa fac am pus tot felul de conversii sqrt (nr) (int) sqrt ((double) nr) nu merge In QuickWatch-ul din MinGW scrie val 800 nush cat. Am mai patit sa afiseze gresit valorile MinGW dar cand trimiteam pe Infoarena sa mearga ok. Titlul: Răspuns: 483 Maxd Scris de: Berceanu Cristian din Aprilie 10, 2009, 17:11:53 Nu inteleg de ce imi da TLE pe testul 6, in rest imi da pe toate :|.
Titlul: Răspuns: 483 Maxd Scris de: Dragos-Alin Rotaru din Mai 30, 2009, 12:51:54 Ai putea incerca sa pregenerezi primele 5200 de numere prime intr-un vector ca sa mai economisesti ceva timp :D
Titlul: Problema Maxd Scris de: Simoiu Robert din Decembrie 21, 2009, 18:49:58 Puteti sa-mi spuneti daca e bine cum am facut si daca intra in timp, eventual sa imi spuneti cum pot sa o imbunatatesc.(eu am facut fara fisiere,doar "schita", restul cu divizori si cu cate numere mai au acelasi nr. de divizori o sa fac eu (imi puteti spune cum det. cate nr. mai au acelasi nr. de divizori, eu cred ca la ultima structura repetitiva trebuie sa merg pana la capat).Merci
Cod: program maxdiv9; Titlul: Răspuns: Problema Maxd Scris de: alexandru din Decembrie 21, 2009, 19:24:04 Folosesti prea multa memorie, limita este de 640 kbytes. Poti sa imbunatatesti ciurul , mai multe gasesti aici (http://infoarena.ro/ciurul-lui-eratostene).
Titlul: Răspuns: 483 Maxd Scris de: Simoiu Robert din Decembrie 21, 2009, 21:03:04 Hey am facut o "optimizare" la acest ciur, nu lucrez in c++ si nu stiu daca e bine , spuneti-mi voi. Merci. Am pus toata problema spuneti-mi ce as mai putea optimiza.Am facut-o fara fisiere si as vrea sa stiu cum as putea vedea cate numere mai au numarul maxim de divizori, trebuie sa parcurg la ultima structura repetitiva toata tructura? Merci
Cod: program maxdiv9; Titlul: Răspuns: Problema Maxd Scris de: alexandru din Decembrie 21, 2009, 21:24:26 Nu prea stiu C++ Defapt e in java. Nu sunt folosite lucruri pe care sa nu le stii plus pe topicul articolului gasesti niste comentarii utile ;)O alta imbunatatire este sa nu declari v ca longint. El retine o valoare booleana( adica retine adevarat sau fals ). Poti sa nu mai initializezi vectorul, pui 0 - numar prim, 1 - nu-i numar prim. ps: ideea era sa injumatatesti memoria folosita. v[ i ] - verifici daca 2*i+1 este sau nu prim ;) Titlul: Răspuns: Problema Maxd Scris de: Simoiu Robert din Decembrie 21, 2009, 21:32:09 Cum sa injumatatesti? am facut-o aici ce am mai facut la ea sper ca e bine.
Cod: program maxdiv9; Titlul: Răspuns: Problema Maxd Scris de: A Cosmina - vechi din Decembrie 22, 2009, 00:48:28 Cod: var ciur: array[1..10000]; Cam asa ar veni ciurul in Pascal, scuza eventualele greseli, n-a mai scris de mult. :) Variantele de ciur din articol sunt mai bune si usor transformabile. Spre sa intelegi. Titlul: Răspuns: 483 Maxd Scris de: Romila din Decembrie 22, 2009, 02:38:46 Am intr-un vector primele 4700 numere prime si fiecare numar din interval il descompun insa primesc TLE pe testele 1,2 si 6 .
Titlul: Răspuns: 483 Maxd Scris de: Simoiu Robert din Ianuarie 01, 2010, 18:06:32 Buna. Am facut problema iar la evaluator imi da KILLED BY SIGNAL 11. Am facut debug si zice asta:segmentation fault. Despre ce e vorba? Aici e sursa:
Cod: #include <fstream> Titlul: Răspuns: 483 Maxd Scris de: Dragos-Alin Rotaru din Ianuarie 01, 2010, 18:31:15 Primesti KBS pentru ca depasesti limitele unui vector. Pentru detalii citeste : http://infoarena.ro/documentatie/evaluator (http://infoarena.ro/documentatie/evaluator) .
Titlul: Răspuns: 483 Maxd Scris de: Simoiu Robert din Ianuarie 01, 2010, 18:35:54 STIU ASTA doar ca nu-mi dau seama de ce. Si ti-am zis am facut debug si mi-a dat eroarea:segmentation fault.
Titlul: Răspuns: 483 Maxd Scris de: Dragos-Alin Rotaru din Ianuarie 01, 2010, 18:41:21 Uita-te mai bine la limite 1 ≤ a ≤ b ≤ 2000000000 iar tu ai forul asta :
Cod: for (i=2;i<=b;i++) v[i]=true P.S : Data viitoare incearca sa citesti enuntul mai atent si sa iti repari singur greselile. Cu siguranta asa inveti ceva nou. Titlul: Răspuns: 483 Maxd Scris de: Simoiu Robert din Ianuarie 01, 2010, 18:50:22 Am rezolvat am facut mai optimizat si a mers cu timpi mici :D
Am intr-un vector primele 4700 numere prime si fiecare numar din interval il descompun insa primesc TLE pe testele 1,2 si 6 . Cum faci problema? adica ce algoritm folosesti ?Editat de admin: Nu posta consecutiv pe aceeasi tema. Modifica mesajele anterioare. Titlul: Răspuns: 483 Maxd Scris de: Vlad Eugen Dornescu din Martie 05, 2010, 12:45:01 Mie imi depasea timpul pentru patru test, in cazul in care imi faceam un ciur de 4700 elemente, dupa ce am redus la 550, mi-a intrat in timp..desi ciurul era optimizat.Weird, nu cred ca alg.meu face asa de multi pasi.
Titlul: Răspuns: 483 Maxd Scris de: FMI Razvan Birisan din Iunie 25, 2012, 11:57:13 Eu nu înțeleg :?
Am încercat să rezolv problema cu ciur și cu un tablou unidimensional pentru factori primi,dar obțin asta: http://infoarena.ro/job_detail/761273 Asta e sursa: Cod: # include <iostream> După am încercat să găsesc altă metodă pentru aflarea numărului de divizori...am găsit ,dar iau TLE pe 4 teste: ](*,) Asta e sursa: Cod: # include <iostream> Mă poate ajuta cineva? :'( Titlul: Răspuns: 483 Maxd Scris de: MciprianM din Iunie 25, 2012, 12:14:18 Gandeste-te ce valori ia k, respectiv prim[k] in primul program. SIGFPE inseamna ca imparti la 0.
Titlul: Răspuns: 483 Maxd Scris de: FMI Razvan Birisan din Iunie 25, 2012, 20:26:30 Deci,orice număr are un divizor prim mai mare decât radicalul lui :-k
Asta înseamna că pentru 2,000,000,000 ,prim[k] > = sqrt(2000000000) sqrt(2000000000) = 44721.4.... Am încercat să mai măresc vectorul , dar după iau "KILLED BY SIGNAL 11" și asta înseamnă că ies din limite. http://infoarena.ro/job_detail/761248 :oops: Titlul: Răspuns: 483 Maxd Scris de: Mihai Calancea din Iunie 25, 2012, 20:27:52 Un numar prim mai mic decat radicalul lui*.
Titlul: Răspuns: 483 Maxd Scris de: FMI Razvan Birisan din Iunie 25, 2012, 20:36:25 Asta înseamnă că ar trebui să mai măresc vectorul "prim",ciurul este până la 45000 > 44721.4....
Dar de la 1 până la 45000 sunt 4676 numere prime,k poate fi maxim 5500. :-s Am văzut că iese din int,l-am pus long,dar tot iau SIGFPE. #-o Titlul: Răspuns: 483 Maxd Scris de: Mihai Calancea din Iunie 25, 2012, 20:49:05 Int-ul este pe 32 de biti acum, deci merge pana in 2 miliarde si ceva. Problema ta apare cand k trece de numarul de numere prime pe care le-ai stocat (asta se intampla cand ultimul factor prim al numarului e mai > sqrt. Astfel prim[k] nu prea mai stii ce contine, poate fi 0 si daca incerci sa faci modulo cu 0 primesti SIGFPE.
Titlul: Răspuns: 483 Maxd Scris de: FMI Razvan Birisan din Iunie 25, 2012, 20:57:11 Trebuie să mă mai gândesc la problema asta :aha:
Mulțumesc pentru ajutor :) Titlul: Răspuns: 483 Maxd Scris de: Stefan Eniceicu din Iunie 26, 2012, 08:20:18 Initializezi toate numerele prime in vectorul final (cel cu nr de divizori pt numerele intre a si b) cu 2, restul cu 1, apoi pentru fiecare prim i, parcurgi incepand cu primu nr divizibil cu i care e >= a (si >= i) pana la ultimu numar divizibil cu i care e <= b. Hope it helps.
Titlul: Răspuns: 483 Maxd Scris de: FMI Razvan Birisan din Iunie 26, 2012, 18:16:01 Am modificat puțin :-'
Programul merge pentru testele de la OJI :) Dar iau WA pe testele 4 și 8. Mă poate ajuta cineva cu un contra-exemplu? :sad: Sau O sugestie? :oops: Pentru Cod: 2 20002 Cod: 15120 80 2 ? Titlul: Răspuns: 483 Maxd Scris de: Stefan Eniceicu din Iunie 27, 2012, 10:59:21 Da bine... :roll:
Incearca: in: 1999980000 2000000000 out: 1999998000 1280 1 in: 15 15 out: 15 4 1 in: 313 313 out: 313 2 1 in: 1 20001 out: 15120 80 2 in: 1 1 out: 1 1 1 in: 321312 328921 out: 327600 180 1 Daca iti merg in continuare, da PM cu sursa. Titlul: Răspuns: 483 Maxd Scris de: FMI Razvan Birisan din Iunie 27, 2012, 16:05:29 Mi-am dat seama de greșeală :roll:
Am luat 100p :winner1: Mulțumesc pentru ajutor,îți rămân dator. :) Titlul: Răspuns: 483 Maxd Scris de: Andrei Andrei din Martie 12, 2014, 20:43:30 O dat Cel de Sus sa reusesc sa fac si problema asta de 100 dupa atata timp in care m-am chinuit cu ciururi si fel de fel de foruri... :D
|