infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Mircea Pasoi din Februarie 19, 2006, 23:43:28



Titlul: 177 GFact
Scris de: Mircea Pasoi din Februarie 19, 2006, 23:43:28
Aici puteţi discuta despre problema GFact (http://infoarena.ro/problema/gfact).


Titlul: 177 GFact
Scris de: Paul-Dan Baltescu din Februarie 20, 2006, 12:21:55
Pot considera ca B "intra" in int64 (long long)?


Titlul: 177 GFact
Scris de: Silviu-Ionut Ganceanu din Februarie 20, 2006, 14:29:14
Este destul de usor de observat ca B <= P * Q, deoarece (P * Q) ! se divide cu siguranta la P^Q, iar P * Q nu depaseste long long.

Silviu


Titlul: 177 GFact
Scris de: Bondane Cosmin din Martie 03, 2006, 22:46:02
imi puteti da niste teste k tot 5pcte iau pe pr ??? plz


Titlul: 177 GFact
Scris de: andreit1 din Martie 03, 2006, 23:57:19
Citat
2000000000 30000       1080015
123456 30000                         19260422
111111111 29999                    10009676333

Atat am obtinut eu cu un program de 100 de puncte. Sper sa fie bune.


Titlul: 177 GFact
Scris de: Tandrau Alexandru din Martie 17, 2006, 20:35:20
Salut

Iau 90 de puncte la problema asta. Primesc "Wrong Answer" pe testele 13 si 19. Am facut descompunerea in factori primi a numarului A^B si am calculat pentru fiecare factor rezultatul, pastrand maximul. Imi puteti da unul dintre testele astea sa vad care e gresala? Mersi

Later Edit: Am gasit problema si am luat 100. Ms


Titlul: 177 GFact
Scris de: Mircea Pasoi din Martie 17, 2006, 20:53:12
Dupa cum s-a mai precizat (scrie si in regulamentul forum-ului) nu se dau testele folosite pentru evaluare.


Titlul: 177 GFact
Scris de: Gogu Marian din Martie 17, 2006, 21:25:41
Pentru ca multi oameni tot timpu' cer teste sau pun unele pe forum si cer raspunsurile pentru ele, cred ca la fiecare problema ar trebui pus pe forum un test mai mare.
Nu din cele oficiale, doar unul destul de mare, cat sa se poata depana programul. Daca se poate chiar aproape de testele maxime.
Are cineva ceva impotriva daca se face asa?
Eu de exemplu am acasa facute cateva generatoare la unele probleme rezolvate de mine si pot sa pun teste daca vrea cineva.


Titlul: Răspuns: 177 GFact
Scris de: Florian Marcu din Mai 09, 2007, 16:12:31
Eu nu pricep de ce iau TLE pe 4 teste...exista cazuri particulare pt testele 12, 13, 18, 19? Nu pot lua mai mult de 80. Am facut si cu cautare binara [k in articol] si dupa o idee de a mea. Am incercat sa verific programul de mii de ori  ](*,). L-am scris din nou de vreo 2 ori  :fighting: Poate cineva sa ma ajute? Multumesc anticipat!


Titlul: Răspuns: 177 GFact
Scris de: Andrei Grigorean din Mai 09, 2007, 19:04:17
Poate ca iti intra in ciclu infinit pe unele cazuri particulare.


Titlul: Răspuns: 177 GFact
Scris de: Florian Marcu din Mai 29, 2007, 20:42:28
Problema asta ma dispera! Am luat toate punctajele posibile mai mici ca 85...intr-adevar...imi intra in ciclu infinit! Am totusi cateva nelamuriri:

1. Fie k un numar prim prin care se imparte p, iar r puterea la care apare k in descomp lui p. Nu prea sunt de accord cu articoloul care atribuie cautarii binare intervalul [ 1 ; r*q*k ] , pentru ca, in ciuda faptului k acest lucru pare logik si e si demonstrat in articol, cand fac cautarea pe interv [1 ; MAXLONG] iau 80 [din cauza a 4 tle-uri, si NU WA) , iar daca o fac k in articol mai pic vreo 2 teste. Ma puteti dumeri?
2. Cam cat de mare e long long-ul?
3. Cam pe unde ar putea sursa mea sa pice? Am facut ceva in genu`:
k=2;
cat timp (p!=1)
  {
    r=0;
    cat timp ( p%k==0 ) { r++; p/=k;}
    daca (r!=0) aplic cautare binara [folosind undeva r*q ];
    k++;  //k este factorul prim
  }
Deci aici e problema cu tle nu cu WA. Nu prea pot sa-mi dau seama unde gresesc... ce cazuri "particulare" exista? Unde poate sa-mi intre in ciclu infinit? Sunt 100% sigur ca nu e de la cautare binara!


Titlul: Răspuns: 177 GFact
Scris de: Silviu-Ionut Ganceanu din Mai 30, 2007, 16:10:06
Inainte de a contrazice solutiile din articole (cred eu corecte in acest caz), a da vina pe compilator ("cat de mare e long long?") si pe loop-uri infinite ar trebui sa fii mai atent cand codezi.

Prima fraza din solutie spune asa: "Primul pas in rezolvarea problemei il reprezinta factorizarea numarului P. Acest lucru se poate realiza intr-o complexitate O(√P)".

Dupa cum imi pare mie tu faci descompunerea in factori primi in O(P). Pentru P prim si foarte mare acest lucru va duce la TLE (in fapt cazuri din astea pici tu).  :fighting:

Daca nu stii cum se face descompunerea in O(sqrt(P)) mai intreaba pe forum.

Spor la treaba si mai calm pe viitor  :-',

Silviu


Titlul: Răspuns: 177 GFact
Scris de: Florian Marcu din Mai 30, 2007, 18:06:31
Deci...nu a spus nimeni ca nu sunt calm! In plus, nu am contrazis articolul, ci doar mi-am exprimat nelamuririle! Faza cu long long era doar o curiozitate, si nimic mai mult. Totusi, dupa cum am facut eu nu prea cred k e o(P), insa nici nu sunt convins ca e o(sqrt(P)). Nu cred k stiu cum se face factorizarea unui numar natural n in complexitate o(sqrt(n))? Poate cineva sa ma ajute? Doar ideea...


Titlul: Răspuns: 177 GFact
Scris de: Stefan Istrate din Mai 30, 2007, 18:34:55
Orice numar P nu va avea 2 divizori primi mai mari ca sqrt(P). In caz contrar, inmultindu-i, ne da un numar mai mare ca P si ajungem la contradictie. Asadar, e suficient sa verificam si sa il impartim pe P la toti divizorii primi pana la sqrt(P) inclusiv, iar daca numarul ramane mai mare ca 1, e clar ca a ramas inca un factor prim la puterea 1.


Titlul: Răspuns: 177 GFact
Scris de: Silviu-Ionut Ganceanu din Mai 30, 2007, 18:35:55
Totusi, dupa cum am facut eu nu prea cred k e o(P), insa nici nu sunt convins ca e o(sqrt(P)).

Repet: pentru P prim k-ul tau merge pana la P pentru ca nu gasesti niciun divizor mai mic decat el. Dati un exemplu simplu (de exemplu 13 1) si urmareste ce face programul.

Pentru ca sa faci O(sqrt(P)) opresti while-ul cand k*k > P. Daca P-ul este diferit de 1 trebuie sa-l pui si pe el in descompunere ca e numar prim. Ia de exemplu 26 si descompune-l (ar trebui sa te opresti cand k e 4 pentru ca 4 * 4 > 13).

Silviu


Titlul: Răspuns: 177 GFact
Scris de: Florian Marcu din Mai 30, 2007, 18:40:58
Aha! In sfarsit cred k am inteles! Deci inmultesc impart p-ul la k atata timp cat k*k < <= p (silviug: ce faci pentru 25 de exemplu?), iar la sfarsit daca p!=1 asta inseamna ca p e numar prim [ma refer la p-ul ramas dupa impartiri ]. Intr-adevar! Cred k asta e problema! Va multumesc mult de ajutor!  :thumbup:


LE: Ei bine, am reusit sa fac de 100! Cu toate acestea am pus [ folosind notatia mea] o cautare binara pe intervalul [1,k*r*q] si luam 95 [cu WA pe testu 1], iar kand am pus [1, 2*k*r*q] am luat 100! [pt mine k reprezinta factorul prim care apare in descomp lu` p, r este puterea la care apare k, iar q are semnificatia din enunt]. Nu prea imi dau seama ce nu am inteles din articol...Va multumesc de ajutor!  :thumbup:


Titlul: Răspuns: 177 GFact
Scris de: Ionescu Robert Marius din Iunie 20, 2007, 17:51:53
pentru 550 1 raspunsul este 42?  :D

imi da si mie cineva nishte tete mai mici (<30000) ca nushtiu unde gresesc:(

Editat de moderator: Nu mai posta de doua ori consecutiv


Titlul: Răspuns: 177 GFact
Scris de: Florian Marcu din Iunie 21, 2007, 09:45:19
gfact.in
Cod:
550 1
10 13
100 100
123 437
20000 12345

gfact.out
Cod:
11
55
805
17507
197530

Cu sursa de 100. Sper sa nu fi bushit nik.


Titlul: Răspuns: 177 GFact
Scris de: Ionescu Robert Marius din Iunie 22, 2007, 09:21:07
ms de teste.Pe al doilea test mie nu imi da 55 ca,la 55 eu am 50 de 2 si  13 de 5 unde  imi mai apare un 2 :(:( in plus


Titlul: Răspuns: 177 GFact
Scris de: Wrong name din Ianuarie 19, 2008, 15:58:44
Imi poate spune cineva de ce imi da la 4,12 si 13 WA? M-am verificat cu testele voastre si imi da bine ](*,)


Titlul: Răspuns: 177 GFact
Scris de: Florian Marcu din Ianuarie 19, 2008, 18:13:08
Pai..din moment ce iei atatea wa-uri, cred ca busesti ceva major. Vezi, poate nu faci cautarea binara pe un interval suficient de mare, sau poate gresesti la descompunerea in factori primi. Da`ti mai multe exemple, pana knd gasesti un test pe care nu da bine...  :)


Titlul: Răspuns: 177 GFact
Scris de: Teodor Plop din Decembrie 12, 2009, 13:14:52
Iau 90 puncte cu Wrong pe testele 18,19.
Am descompus in factori primi A^B,am cautat primul numar care are toti exponentii numerelor prime din A^B mai mari sau egali cu exponentii descompunerii lui A^B.
la testul
111111111 29999   raspunsul este -2147483648 si cu long long...
anyone help?:D


Titlul: Răspuns: 177 GFact
Scris de: Vlad Tarniceru din August 23, 2010, 18:03:35
Fisierul de iesire va contine numarul natural B cu propietatea din enunt.

O mica greseala .. :)


Titlul: Răspuns: 177 GFact
Scris de: Bodnariuc Dan Alexandru din Ianuarie 27, 2012, 19:06:42
hmm uitati ce afiseaza urmatorul program
#include <fstream>
using namespace std;
ifstream f("inm.in");
ofstream g("inm.out");
unsigned long long DE;
int main()
{
  DE=20000000*30000;
  g<<DE<<'\n';


  f.close();
  g.close();
    return 0;
}
afiseaza o valoare uriasa care nici decum nu coincide cu rezultatul oare dc?? si imi da la warning "integer overflow in expresion"


Titlul: Răspuns: 177 GFact
Scris de: Dragos-Alin Rotaru din Ianuarie 27, 2012, 19:24:04
Incearca sa faci asa:
Cod:
DE = (unsigned long long)20000000*30000

De ce? Pentru ca initial inmultirea are loc intre 2 int-uri iar rezultatul va fi tot unul int. Convertind primul numar la tipul de date dorit inmultirea se va efectua si ea pe unsigned long long (cel cu mai multi biti).