h2. Indicaţii de rezolvare
O primă soluţie are complexitate $O(M*A*log(A+B))$ şi ar obţine $30$ de puncte. În acest caz vom parcurge toate numerele din intervalul $(1,A)$, verificând pentru fiecare dacă are cmmdc-ul cu $B$ egal cu $1$. O sursă pe această idee se poate găsi aici.
O primă soluţie are complexitate $O(M*A*log(A+B))$ şi ar obţine $30$ de puncte. În acest caz vom parcurge toate numerele din intervalul $(1,A)$, verificând pentru fiecare dacă are cmmdc-ul cu $B$ egal cu $1$. O sursă pe această idee se poate găsi 'aici':job_detail/372817?action=view-source.
Pentru o soluţie mai performantă trebuie implementat principiul includerii si excluderii, despre care puteţi citi pe 'wikipedia':http://en.wikipedia.org/wiki/Inclusion-exclusion_principle sau pe 'mathworld':http://mathworld.wolfram.com/Inclusion-ExclusionPrinciple.html. Concret, presupunând că trebuie să raspundem la query-ul $20 6$, o să ne intereseze numărul de numere divizibile cu $2$, numărul de numere divizibile cu $3$ şi numărul de numere divizibile cu $2 şi 3$ mai mici decât $20$. Numarul de numere divizibile cu $x$ mai mici decat $y$ va fi simplu $[y/x]$ (parte intreagă din $y/x$). Soluţia noastră va fi reprezentată de $A-Nr2-Nr3+Nr6$, unde $Nrx$ este numărul de numere divizibile cu $x$ mai mici decât $20$. Observăm ca numarul de apariţii ale numerelor cu număr impar de factori primi se scad din solţie, în timp ce pentru număr par de factori primi se adună. Tabelul de mai jos ilustrează cele spuse până acum, o casută $(p,q)$ fiind marcată dacă $p$ divide $q$.
!problema/pinex?tabel.JPG 90%!
Această abordare are complexitate $O(T*NRMAXF*2^NRMAXF^)$ şi ar obţine $70$ de puncte. Prin $NRMAXF$ ne referim la numărul maxim de factori primi ce poate să îi aibă numărul $B$.
Pentru o soluţie mai performantă trebuie implementat principiul includerii si excluderii, despre care puteţi citi pe 'wikipedia':http://en.wikipedia.org/wiki/Inclusion-exclusion_principle sau pe 'mathworld':http://mathworld.wolfram.com/Inclusion-ExclusionPrinciple.html. Concret, presupunând că trebuie să raspundem la query-ul $20 6$, o să ne intereseze numărul de numere divizibile cu $2$, numărul de numere divizibile cu $3$ şi numărul de numere divizibile cu $2 şi 3$ mai mici decât $20$. Numarul de numere divizibile cu $x$ mai mici decat $y$ va fi simplu $[y/x]$ (parte intreagă din $y/x$). Soluţia noastră va fi reprezentată de $A-Nr2-Nr3+Nr6$, unde $Nrx$ este numărul de numere divizibile cu $x$ mai mici decât $20$. Numărul de apariţii ale numerelor cu număr impar de factori primi se scad din soluţie, în timp ce pentru număr par de factori primi se adună. Tabelul de mai jos ilustrează cele spuse până acum, o casută $(p,q)$ fiind marcată dacă $p$ divide $q$.
!problema/pinex?tabel.JPG 100%!
'Această abordare':job_detail/372842?action=view-source are complexitate $O(T*NRMAXF*2^NRMAXF^)$ şi obţine $70$ de puncte. Prin $NRMAXF$ ne referim la numărul maxim de factori primi ce poate să îi aibă numărul $B$.
Pentru obţinerea punctajului maxim trebuie să aducem nişte îmbunatăţiri soluţiei precedente. În primul rând, atunci când determinăm factorii primi ai lui $B$, ne vom uita pana la $sqrt(B)$. Cum această valoare este $≤ 1 000 000$, putem precalcula numerele prime prin care vom itera la fiecare query. Altă optimizare utilă nu doar la această problemă este să precalculăm puterile lui $2$ pentru backtracking-ul care ne determina soluţia. Soluţia de $100$ de puncte se află aici.
Pentru punctaj maxim trebuie să aducem îmbunatăţiri soluţiei precedente. În primul rând, atunci când determinăm factorii primi ai lui $B$, ne vom uita pana la $sqrt(B)$. Cum această valoare este mai mică decât $1 000 000$, putem precalcula numerele prime prin care vom itera la fiecare query. Altă optimizare utilă nu doar la această problemă este să precalculăm puterile lui $2$ pentru backtracking-ul care ne determina soluţia. O astfel de soluţie ce obţine $100$ de puncte se află 'aici':job_detail/372843?action=view-source.
h2. Aplicaţii
'Mins':problema/mins
'Jap':problema/jap
'Secventa farey':problema/farey
'Cowfood':problema/cowfood
'Rifleman':http://acm.sgu.ru/problem.php?contest=0&problem=370 sgu
== include(page="template/taskfooter" task_id="pinex") ==