infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din August 13, 2007, 22:57:25



Titlul: 495 Numere 6
Scris de: Adrian Diaconu din August 13, 2007, 22:57:25
Aici puteţi discuta despre problema Numere 6 (http://infoarena.ro/problema/numere6).


Titlul: Răspuns: 495 Numere 6
Scris de: Andrei Homorodean din August 14, 2007, 19:41:23
A luat cineva 100 cu varianta cu dinamica, adica O(a*nrdiv(b))? Vad ca intra solutia oficiala, varianta cu back. Daca la judet s-a luat 100 fara prea mari optimizari, cred ca ar trebui lasat si aici.

btw: e ok sa spunem si pe forum daca stim autorii?


Titlul: Răspuns: 495 Numere 6
Scris de: Paul-Dan Baltescu din August 14, 2007, 19:58:07
Sigur, spune-i. Pe infoarena merg ambele variante de 100.


Titlul: Răspuns: 495 Numere 6
Scris de: Andrei Homorodean din August 14, 2007, 20:07:23
Am trimis sursa oficiala si nu merge. Nici a mea optimizata nu merge.

La asta e Ilie Vieru, si la cezar e Stelian Ciurea(la cezar sunt 99% sigur).


Titlul: Răspuns: 495 Numere 6
Scris de: Bondane Cosmin din August 14, 2007, 23:05:12
Am trimis sursa oficiala si nu merge. Nici a mea optimizata nu merge.

Mie mi'a mers dinamica in O( A*NrDiv(B) ) fara prea mari probleme.  :thumbup:


Titlul: Răspuns: 495 Numere 6
Scris de: Andrei Homorodean din August 15, 2007, 00:05:50
Da, asa e.. am precalculat o matrice unde gasesc pozitiile divizorilor si a intrat ok. Am impresia ca dura prea mult impartirea.


Titlul: Răspuns: 495 Numere 6
Scris de: Sebastian Crisan din Octombrie 25, 2007, 20:40:45
ce as putea optimiza la solutia dinamica ca sa nu mai primesc TLE? multumesc.


Titlul: Răspuns: 495 Numere 6
Scris de: Paul-Dan Baltescu din Octombrie 25, 2007, 20:45:24
Inlocuieste % cu scadere.


Titlul: Răspuns: 495 Numere 6
Scris de: Tabara Mihai din Ianuarie 03, 2008, 01:31:10
Iau 90 de puncte cu 1 TLE ](*,)

Am optimizat tot ce am putut optimiza. Dinamica are complexitatea de O(A*nrdiv(B)*KONSTANTA )
unde KONSTANTA <= 9(defapt e numarul de divizori a lu B mai mici ca 9). Am pus scaderi in loc de modulo si tot nu merge. Iau TLE pe testul 9.

Ce optimizari as putea sa mai fac ?

Am trimis ca test si solutia oficiala si ia TLE pe acelasi test 9.
Am citit mai sus ce a scris peanutz (http://infoarena.ro/utilizator/peanutz) dar nu prea am inteles. :-k

[LATER EDIT] A mers pana la urma de 100.Trebuia sa scap cumva de operatia aia de impartire care manca mult timp.   ( Thanks Cosi )
 


Titlul: Răspuns: 495 Numere 6
Scris de: Stefan Gheorghe din Martie 28, 2008, 14:56:50
eu am trimis o formula si am luat 10 pct pe testul 9:D:D:D
write(g,((a*ct mod 9973)*ct1)mod 9973); unde ct= nr de div al lui b si ct1 = nr de div al lui b <10
*ct = nr de div al lui b-1:D,

[editat de moderator] Nu posta de doua ori consecutiv, de asemenea incearca ca postul sa aibe un sens.


Titlul: Răspuns: 495 Numere 6
Scris de: Cosmin-Mihai Tutunaru din Februarie 04, 2009, 15:53:24
Ma scoate din pepeni problema asta.... :angry:
Cred ca ar trebui marit timpul....

Ce se poate mai performant decat ce am facut eu in codul:...
Adica am precalculat impartirile....in o(nr_div(b)*nr_div_mai_mic_10(b))
iar modulo il fac o data la 1000 de iteratii.....
Totusi primesc TLE pe testu 9....
Cred ca este prea aiurea ca la o problema sa se impuna un timp atat de mic....astfel icnat sa conteze stiu eu ce naiba ar putea conta....

Cod:
//salvam divizorii lui b
for(i=1;i<=k;i++)
if(!(k%i)) //am asit un divizor al lui k
d[++nr]=i; //salvam divizorul :P

//prelucram matricea c[][]...
for(i=1;i<=nr;i++)
for(j=1;j<=nr&&d[j]<=9;j++)
c[i][j]=d[i]/d[j];

//initializam pt a=1
for(i=1;i<=nr&&d[i]<=9;i++)
m[1][d[i]]=1; //pt a=1, exista o singura posibilitate pt divizorii lui b mai mici ca 10

for(i=2;i<=n;i++) //calculam pentru fiecare a in parte
{
for(j=1;j<=nr;j++) //luam pe rand toate produsele care sunt divizibile cu k
{
m[i%2][d[j]]=0; //golim...am ajuns pt prima data pt i-ul asta :P
for(p=1;p<=nr&&d[p]<=9;p++)
if(!(d[j]%d[p])) // al j-lea divizor al lui k, este multiplu al celui de-al p-lea divizor
m[i%2][d[j]]=m[i%2][d[j]]+m[(i-1)%2][c[j][p]]; //la psoibilitatiile gasite pana acum, se adauga si posibilitatile pt al p-lea divizor
}
if(i%1000) //din 1000 in 1000...facem modulo :P....ca sa economism timp :))
for(j=1;j<=nr;j++)
m[i%2][d[j]]%=modulo;
}

//afisem numarul e posibilitati
printf("%d",m[n%2][k]%modulo);


Titlul: Răspuns: 495 Numere 6
Scris de: Florian Marcu din Februarie 04, 2009, 15:58:33
Incearca sa faci modulo prin scaderi repetate ( fara sa folosesti "%"), ca e mai rapid.


Titlul: Răspuns: 495 Numere 6
Scris de: Cosmin-Mihai Tutunaru din Februarie 04, 2009, 16:18:22
Incearca sa faci modulo prin scaderi repetate ( fara sa folosesti "%"), ca e mai rapid.
Am trimis si fara sa fac modulo deloc.....(desigur...la multe teste primesc WA)...dar la testul 9 tot nu intra in timp..


Titlul: Răspuns: 495 Numere 6
Scris de: Gabriel Bitis din Februarie 04, 2009, 16:23:56
Incearca sa faci modulo prin scaderi repetate ( fara sa folosesti "%"), ca e mai rapid.
Asta merge mai rapid decat scaderile repetate:
Cod:
cat = X / MOD;
rez = X - MOD * cat;


Titlul: Răspuns: 495 Numere 6
Scris de: Cosmin-Mihai Tutunaru din Februarie 06, 2009, 01:07:14
Si eu ce fac?...
Am trimis sursa si fara modulo deloc...tot nu intra in timp....
La mine e posibil sa fie din cauza ca folosesc o matrice cu 2 linii....in loc sa folosesc 2 vectori (cred k am ales varianta mai frumoasa)
Insa nu cred ca din cauza asta trebuie sa am problema asta "pe rosu"......
Dupa parerea mea nu aici se face diferentierea dintre 2 surse.......
Inca o data zic....cred ca ar trebui marit timpul pt aceasta problema...


Titlul: Răspuns: 495 Numere 6
Scris de: Savin Tiberiu din Februarie 06, 2009, 09:37:34
Poti rezolva problema in O(B * log A) si intra in timp fara probleme, deci dupa parerea mea limita de timp e buna.


Titlul: Răspuns: 495 Numere 6
Scris de: Zajzon Barna din Februarie 14, 2009, 17:45:50
Am facut retinand impartirile, scazand sau folosind expresia spusa de gabitzish, am pus short peste tot si tot imi iese din timp ](*,) ... nu pot sa-mi dau seama ce poate fi, desi algoritmul e cam acelasi cu cel oficial. Un alt hint ar fi bineveit :) Btw, daca tot sunt testele de la judetene, cred ca ar fi fost fair sa intre macar algoritmul oficial :P


Titlul: Răspuns: 495 Numere 6
Scris de: chisinau gheorghita din Martie 12, 2009, 16:37:44
Nu prea are precizie evaluatorul cand spune cata memorie am folosit......am un vector de 9000 si inca unu de 100 de elemente...teoretic ar fi ~40 de kb si mie imi arata ca am folosit 200...cam mare diferenta nu?


Titlul: Răspuns: 495 Numere 6
Scris de: Philip din Martie 13, 2009, 11:50:47
Dati-mi va rog niste teste, si raspunsul la ele, sa imi dau seama unde am gresit  ](*,).
Pe testele exemplu, pe testele create de mine, si pe 6 din 10 de la evaluare merge bine.
http://infoarena.ro/job_detail/280166


Titlul: Răspuns: 495 Numere 6
Scris de: gaboru corupt din Martie 13, 2009, 11:59:38
iti poti scoate testele oficiale de la OJI http://infoarena.ro/downloads?action=download&file=oji2007.zip&safe_only=false


Titlul: Răspuns: 495 Numere 6
Scris de: Philip din Martie 13, 2009, 12:40:21
Mersi  :ok:

L.E. Am facut o mica modificare (round in loc de trunc), dar la testul 7 primesc tot WA, desi pe testul oficial imi da raspunsul corect.
Pe infoarena sunt aceleasi teste?

Inca ceva... daca poate sa verifice cineva care a luat 100 de puncte, ce rezultat ii da pt a=8000, b=8192.


Titlul: Răspuns: 495 Numere 6
Scris de: Flaviu Pepelea din Martie 13, 2009, 17:58:51
Mie imi da 8929!


Titlul: Răspuns: 495 Numere 6
Scris de: Dragos din Februarie 27, 2010, 18:40:50
Imi poate oferi si mie cineva o problema asemanatoare cu explictia rationamentului in urma caruia gasim relatia de recurenta? :D

Multumesc anticipat!


Titlul: Răspuns: 495 Numere 6
Scris de: Florian Marcu din Februarie 27, 2010, 21:02:18
 tablite  (http://infoarena.ro/problema/tablite), daca imi amintesc bine.


Titlul: Răspuns: 495 Numere 6
Scris de: Dragos din Februarie 27, 2010, 22:15:55
Ce s-a intamplat cu evaluatorul? ](*,)
Am trimis o sursa pentru 60% din punctaj si iau numai WA desi la mine pe calculator imi dau toate testele corect(pentru a=1000, b=1000 raspunsul este 1293 nu?). ](*,)  
http://infoarena.ro/job_detail/405365 (http://infoarena.ro/job_detail/405365)
Acasa utilizez codeblocks.
Mentionez ca pentru sursa de 60% am folosit sursa asta: http://infoarena.ro/job_detail/405317  (http://infoarena.ro/job_detail/405317) pe care am folosit o matrice intraga in loc de 2 linii si imi depasea memoria. Cu toate astea am luat 20 de puncte la ultima sursa mentionata.
Multumesc anticipat pentru eventualele clarificari!

@Marcu Florian Mersi
Later edit: Am incercat pe testele de la OJI 2007 si pe toate testele in mici(cele 6) imi da raspunsul corect iar pe infoarena inca iau 0.
Later later edit: Bill Gates e de vina!


Titlul: Răspuns: 495 Numere 6
Scris de: Vlad Eugen Dornescu din Aprilie 20, 2010, 15:23:35
si eu fac in O(Nr_div(b) * a * 10) si iau doar 80 ?
nu se poate mari timpul de executie ?


Titlul: Răspuns: 495 Numere 6
Scris de: Iffi Fiffi din Iunie 24, 2010, 16:08:56
O idee cum as putea rezolva problema asta prin backtracking?


Titlul: Răspuns: 495 Numere 6
Scris de: Mircea Dima din Iulie 10, 2010, 20:39:29
ideea e ca produsul il poti obtine destul de repede din cifre > 1 (de ex 1024 = 10 de 2)
generezi prin back siruri de cifre > 1 astfel incat sa obtii produsul dorit si celelalte cifre pui 1.
Trebuie sa mai vezi in cate moduri poti aranja ca sa obtii un numar.


Titlul: Răspuns: 495 Numere 6
Scris de: Savin Tiberiu din Iulie 10, 2010, 21:30:54
Nu asa se face problema. Asta mie mi se pare un fel de ciucuiala, desi probabil complexitatea worst-case e buna.
Incearca sa pleci de la dinamica clasica a[ i ][ j ] - numarul de numere de i cifre care dau restul j la impartirea cu B. Asta are complexitate O(A * B) si ar trebui sa o optimizezi.
Hint: memoria folosita e O(log A * B)


Titlul: Răspuns: 495 Numere 6
Scris de: Mircea Dima din Iulie 11, 2010, 14:04:06
da, evident ca solutia optima e O(B log A) dar in solutiile oficiale de la OJI existau 2 solutii:
una in O(a * sqrt b) si una cu backtracking... baiatul a intrebat cum se face prin backtracking...


Titlul: Răspuns: 495 Numere 6
Scris de: Iffi Fiffi din Iulie 13, 2010, 14:12:12
Intai, multumesc de raspunsuri.
@Savin Tiberiu
Nu imi dau seama care valoare din matricea aceea e rezultatul. a[A][0] nu e acela deoarece acest rezultat ia in cont si numerele cu produsul cifrelor g*B, unde g e numar natural.


Titlul: Răspuns: 495 Numere 6
Scris de: Mircea Dima din Iulie 13, 2010, 14:21:02
E gresita relatia data de devilkind. (acum am vazut si eu)
Cel mai probabil a vrut sa zica asa:

dp[ i ][ j ] = numarul de numere de i cifre cu produsul cifrelor j

raspunsul e in dp[ A ][ B ]. complexitatea O(A * B) daca se implementeaza direct.

De aici se poate optimiza obtinandu-se O(A * sqrt B) sau optim O(B logA)
 


Titlul: Răspuns: 495 Numere 6
Scris de: Savin Tiberiu din Iulie 13, 2010, 15:08:09
Ah da scz. Nu am citit atent enuntul. Am avut impresia ca trebuie ca produsul sa divida numarul b, nu sa fie egal.


Titlul: Răspuns: 495 Numere 6
Scris de: Iffi Fiffi din Iulie 15, 2010, 13:44:56
Iau 90 de puncte, din cauza TLEului de la testul 9.Nu imi dau seama cum as putea scoate O(B logA).Nu vad cum as putea folosi cautarea binara aici si vazand complexitatea aia nu imi vine nimic altceva in cap.Un hint? :wink:


Titlul: Răspuns: 495 Numere 6
Scris de: Mircea Dima din Iulie 15, 2010, 18:31:24
Un numar de i cifre (i = par) poate fi obtinut concatenand 2 numere de i/2 cifre. Iar unul de i cifre (i = impar)
poate fi obtinut dintr-un numar de i-1 cifre adaugand o cifra. (nu are legatura cu cautarea binara)


Titlul: Răspuns: 495 Numere 6
Scris de: Florin Gabriel Haja din Octombrie 06, 2016, 08:25:30
Ma puteti ajuta, va rog, cu niste idei? Am optimizat la maxim problema, luand prima data nr. de solutii pe puterile lui 2, apoi calculand in functie de bitii lui n. De asemenea, aloc memorie doar pt. randurile de matrice de care am nevoie. Nu scot mai mult de 90 de puncte  :angry:
http://www.infoarena.ro/job_detail/1771869


Titlul: Răspuns: 495 Numere 6
Scris de: Bogdan Pop din Octombrie 06, 2016, 19:34:51
Ma puteti ajuta, va rog, cu niste idei? Am optimizat la maxim problema, luand prima data nr. de solutii pe puterile lui 2, apoi calculand in functie de bitii lui n. De asemenea, aloc memorie doar pt. randurile de matrice de care am nevoie. Nu scot mai mult de 90 de puncte  :angry:
http://www.infoarena.ro/job_detail/1771869
Ai putea incerca sa nu scrii using namespace std si sa folosesti citirea din C.Eu asa am reusit sa  intru in memorie la alta problema la care nu reuseam cu streamuri din cauza ca avea o limita mica la care se simtea schimbarea.


Titlul: Răspuns: 495 Numere 6
Scris de: Florin Gabriel Haja din Octombrie 06, 2016, 19:41:24
Ai putea incerca sa nu scrii using namespace std si sa folosesti citirea din C.Eu asa am reusit sa  intru in memorie la alta problema la care nu reuseam cu streamuri din cauza ca avea o limita mica la care se simtea schimbarea.
Mersi mult! Esti genial!  :yahoo: Am luat suta  :winner1:
Dovada: http://www.infoarena.ro/job_detail/1772551


Titlul: Răspuns: 495 Numere 6
Scris de: Adrian Buzea din Octombrie 11, 2016, 10:52:05
Eu incerc sa fac un backtracking, si iau WA pe 3 teste.

Practic generez toate combinatiile de cifre care au produsul ala si apoi calculez nr de scrieri ale unui numar de a cifre cu fiecare combinatie.
Sa zicem ca am gasit o combinatie din n cifre care nu-s neaparat distincte.

Calculez Sol = Combinari(a, n) * n! (adica Aranjamente(a, n)) = nr de posibilitati de a scrie un nr de a cifre cu n cifre > 1 distincte.

Apoi pentru fiecare cifra Ai, 1 < i < 10 impart Sol prin fact(Ai), unde Ai e frecventa cifrei i.

E ceva gresit in rationamentul asta ?

Edit:
Problema era de la impartirea modulo ceva. Luam 90p facand (A/B) mod p. Cam mult pentru noroc chior. Cu invers modular am luat 100.


Titlul: Răspuns: 495 Numere 6
Scris de: FMI Ciltea Marian din Decembrie 07, 2016, 21:59:38
Iau WA pe toate testele, cu toate ca algoritmul meu a mers pentru toate testele pe care l-am incercat(si cele din kitul oji). Mai are cineva problema asta?