{"id":"informatyka-2016-maj-matura-rozszerzona/zad/1.2","paper_id":"informatyka-2016-maj-matura-rozszerzona","number":"1.2","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2016,"month":"maj","level":"rozszerzona","text":"Zadanie 1.2. (0-4)\nDana jest liczba całkowita a większa od 1. Ułóż i zapisz w wybranej przez siebie notacji\nalgorytm, który znajdzie i wypisze liczbę b skojarzoną z a lub komunikat „NIE”, jeśli taka\nliczba nie istnieje.\nW zapisie algorytmu możesz korzystać tylko z następujących operacji arytmetycznych:\ndodawania, odejmowania, mnożenia, dzielenia całkowitego i obliczania reszty z dzielenia.\nUwaga:\nPrzy ocenie algorytmu będzie brana pod uwagę liczba operacji arytmetycznych\nwykonywanych przez Twój algorytm.\nSpecyfikacja:\nDane:\nLiczba całkowita a > 1.\nWynik:\nLiczba całkowita b skojarzona z a lub komunikat „NIE”, jeśli taka liczba\nnie istnieje.\nAlgorytm:\nWypełnia\negzaminator\nNr zadania\n1.1.\n1.2.\nMaks. liczba pkt.\n1\n4\nUzyskana liczba pkt.\nMIN_1R","answer":null,"answer_text":"Zadanie 1.2. (0-4)\nIII. Rozwiązywanie problemów i\npodejmowanie decyzji […], z zastosowaniem\npodejścia algorytmicznego.\n5. Rozwiązywanie problemów i podejmowanie\ndecyzji […], stosowanie podejścia algorytmicznego.\nZdający:\n2) stosuje podejście algorytmiczne do rozwiązywania\nproblemu;\n4) dobiera efektywny algorytm do rozwiązania\nsytuacji problemowej i zapisuje go w wy branej\nnotacji;\n11) opisuje podstawowe algorytmy i stosuje:\na) algorytmy na liczbach całkowitych;\n18) oblicz liczbę operacji wykonywanych przez\nalgorytm.\nSchemat punktowania\n4 p. - za poprawny algorytm, w tym:\n- 3 p. - za poprawne obliczanie sumy dzielników zadanej liczby (lub potencjalnej liczby\nskojarzonej):\no 1 p. - za sumowanie kolejnych dzielników,\no 1 p. - za poprawną konstrukcję pętli,\no 1 p. - za algorytm o złożoności nie gorszej niż √݊ ;\n- 1 p. - za poprawne ustalenie liczby b oraz za sprawdzenie, czy liczby a i b są skojarzone;\n0 p. - za odpowiedź błędną albo brak odpowiedzi.\nPrzykładowa odpowiedź\nfunkcja sumadz(n) {\nsuma = 1\ni = 2\ndopóki (i*i <= n)\njeżeli (n mod i = 0)\nsuma = suma + i\njeżeli (n div i != i)\nsuma = suma + n/i\ni = i + 1\nzwróć suma\n}\nx = sumadz(a)\ny = sumadz(x-1)\njeżeli (y-1 = a)\nwypisz x-1\nw przeciwnym wypadku\nwypisz „NIE”","solution":"## Poprawna odpowiedź\n\n**Algorytm (pseudokod):**\n\nfunkcja sumadz(n):\nsuma ← 1\ni ← 2\ndopóki i*i ≤ n wykonuj:\njeżeli n mod i = 0:\nsuma ← suma + i\njeżeli n div i ≠ i:\nsuma ← suma + n div i\ni ← i + 1\nzwróć suma\n\nx ← sumadz(a) // x = suma dzielników właściwych a; szukamy b takiego, że b = x - 1\nb ← x - 1\njeżeli b > 1:\ny ← sumadz(b)\njeżeli y = a + 1:\nwypisz b\nw przeciwnym razie:\nwypisz \"NIE\"\nw przeciwnym razie:\nwypisz \"NIE\"\n\n## Sposób 1 - wykorzystanie symetrii definicji\n\n**Idea kluczowa:** definicja skojarzenia mówi `sumadz(a) = b + 1`, więc skoro znamy a, możemy **wyliczyć kandydata** `b = sumadz(a) - 1`. Potem wystarczy sprawdzić drugi warunek: czy `sumadz(b) = a + 1`.\n\n**Krok po kroku:**\n1. Oblicz `x = sumadz(a)`. To koszt O(√a).\n2. Kandydat: `b = x - 1`.\n3. Jeśli `b ≤ 1`, brak skojarzenia (b musi być > 1 z definicji).\n4. Oblicz `y = sumadz(b)`. To koszt O(√b).\n5. Jeśli `y = a + 1` - wypisz b. W przeciwnym razie wypisz „NIE”.\n\nTo daje algorytm O(√a + √b), czyli **O(√n)** ogólnie.\n\n## Sposób 2 - implementacja Python\n\n```python\ndef sumadz(n):\nif n < 2:\nreturn 0\nsuma = 1\ni = 2\nwhile i * i <= n:\nif n % i == 0:\nsuma += i\nif n // i != i:\nsuma += n // i\ni += 1\nreturn suma\n\ndef skojarzona(a):\nx = sumadz(a)\nb = x - 1\nif b <= 1:\nreturn \"NIE\"\nif sumadz(b) == a + 1:\nreturn b\nreturn \"NIE\"\n\nprint(skojarzona(75)) # 48\nprint(skojarzona(140)) # 195\nprint(skojarzona(20)) # NIE\n\n**C++:**\n```cpp\n#include <iostream>\nusing namespace std;\n\nlong long sumadz(long long n) {\nif (n < 2) return 0;\nlong long s = 1;\nfor (long long i = 2; i * i <= n; i++) {\nif (n % i == 0) {\ns += i;\nif (n / i != i) s += n / i;\n}\n}\nreturn s;\n}\n\nint main() {\nlong long a; cin >> a;\nlong long x = sumadz(a);\nlong long b = x - 1;\nif (b > 1 && sumadz(b) == a + 1) cout << b;\nelse cout << \"NIE\";\nreturn 0;\n}\n\n**Pascal:**\n```pascal\nfunction Sumadz(n: LongInt): LongInt;\nvar s, i: LongInt;\nbegin\nif n < 2 then begin Sumadz := 0; Exit end;\ns := 1;\ni := 2;\nwhile i * i <= n do begin\nif n mod i = 0 then begin\ns := s + i;\nif n div i <> i then s := s + n div i;\nend;\ni := i + 1;\nend;\nSumadz := s;\nend;\n\nvar a, x, b: LongInt;\nbegin\nReadln(a);\nx := Sumadz(a);\nb := x - 1;\nif (b > 1) and (Sumadz(b) = a + 1) then Writeln(b)\nelse Writeln('NIE');\nend.\n\n## Reference informatyczny - suma dzielników w O(√n)\n\n> Reference - Wyznaczanie sumy dzielników:\n> - **Trywialne O(n)**: iteruj i od 1 do n-1, jeśli n mod i = 0 dodaj i. Za wolne dla dużych n.\n> - **O(√n)**: iteruj i od 2 do √n. Każdy dzielnik d < √n ma parę n/d > √n. Sprawdzamy `i*i ≤ n` (nie `i ≤ sqrt(n)` - żeby uniknąć błędów float).\n> - **Pułapka kwadratu doskonałego**: gdy `i = n/i` (np. n=36, i=6), nie dodawaj dwa razy.\n> - **1 jest zawsze dzielnikiem** liczby > 1, dlatego inicjujemy `suma = 1`.\n> - **Liczby doskonałe** (perfect numbers): liczby gdzie suma dzielników właściwych = sama liczba. Przykład: 6 = 1+2+3, 28 = 1+2+4+7+14.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 1.2, max 4 pkt):\n> - **3 pkt** za poprawne obliczanie sumy dzielników:\n> - 1 pkt - sumowanie dzielników\n> - 1 pkt - poprawna konstrukcja pętli\n> - 1 pkt - złożoność **nie gorsza niż O(√n)**\n> - **1 pkt** za poprawne ustalenie b oraz sprawdzenie warunku skojarzenia\n> - **0 pkt** za odpowiedź błędną\n\n**WAŻNE - warunek z treści zadania:** \"Przy ocenie będzie brana pod uwagę liczba operacji arytmetycznych\". Stąd O(√n), nie O(n).\n\n## Typowe pułapki\n\n- **Złożoność O(n)** zamiast O(√n) - utrata 1 pkt. Pętla `dla i = 1 do n-1` to klasyczna pułapka.\n- **Liczenie pary (i, n/i) dwa razy** dla kwadratu doskonałego - wynik zawyżony.\n- **Pomijanie 1** w sumie - wtedy suma zawsze o 1 mniejsza.\n- **Próba enumerowania wszystkich b** od 2 do M - nieoptymalne; lepiej skorzystać z `b = sumadz(a) - 1`.\n- **Pomylenie definicji** - w zadaniu jest `+1` po obu stronach, nie jak w klasycznych amicable numbers gdzie suma a = b a suma b = a.\n- **Pominięcie warunku `b > 1`** - z definicji a i b > 1.\n\n## Złożoność obliczeniowa\n\n- `sumadz(n)`: pętla i = 2 do √n → **O(√n)** operacji.\n- Cały algorytm: 2 wywołania sumadz → **O(√a + √b) = O(√n)**.\n- **Liczba operacji arytmetycznych**: rzędu 2√a (porównanie + mod + dodawanie w każdej iteracji).","image":"img/informatyka-2016-maj-matura-rozszerzona/zad-1.2.webp","solution_image":null,"topics":null,"page_from":3,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2016 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 1.2. (0-4)<br>Dana jest liczba całkowita a większa od 1. Ułóż i zapisz w wybranej przez siebie notacji<br>algorytm, który znajdzie i wypisze liczbę b skojarzoną z a lub komunikat „NIE”, jeśli taka<br>liczba nie istnieje.<br>W zapisie algorytmu możesz korzystać tylko z następujących operacji arytmetycznych:<br>dodawania, odejmowania, mnożenia, dzielenia całkowitego i obliczania reszty z dzielenia.<br>Uwaga:<br>Przy ocenie algorytmu będzie brana pod uwagę liczba operacji arytmetycznych<br>wykonywanych przez Twój algorytm.<br>Specyfikacja:<br>Dane:<br>Liczba całkowita a &gt; 1.<br>Wynik:<br>Liczba całkowita b skojarzona z a lub komunikat „NIE”, jeśli taka liczba<br>nie istnieje.<br>Algorytm:<br>Wypełnia<br>egzaminator<br>Nr zadania<br>1.1.<br>1.2.<br>Maks. liczba pkt.<br>1<br>4<br>Uzyskana liczba pkt.<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 1.2. (0-4)<br>III. Rozwiązywanie problemów i<br>podejmowanie decyzji […], z zastosowaniem<br>podejścia algorytmicznego.</p>\n<ol><li>Rozwiązywanie problemów i podejmowanie</li></ol>\n<p>decyzji […], stosowanie podejścia algorytmicznego.<br>Zdający:</p>\n<ol><li>stosuje podejście algorytmiczne do rozwiązywania</li></ol>\n<p>problemu;</p>\n<ol><li>dobiera efektywny algorytm do rozwiązania</li></ol>\n<p>sytuacji problemowej i zapisuje go w wy branej<br>notacji;</p>\n<ol><li>opisuje podstawowe algorytmy i stosuje:</li></ol>\n<p>a) algorytmy na liczbach całkowitych;</p>\n<ol><li>oblicz liczbę operacji wykonywanych przez</li></ol>\n<p>algorytm.<br>Schemat punktowania<br>4 p. - za poprawny algorytm, w tym:</p>\n<ul><li>3 p. - za poprawne obliczanie sumy dzielników zadanej liczby (lub potencjalnej liczby</li></ul>\n<p>skojarzonej):<br>o 1 p. - za sumowanie kolejnych dzielników,<br>o 1 p. - za poprawną konstrukcję pętli,<br>o 1 p. - za algorytm o złożoności nie gorszej niż √݊ ;</p>\n<ul><li>1 p. - za poprawne ustalenie liczby b oraz za sprawdzenie, czy liczby a i b są skojarzone;</li></ul>\n<p>0 p. - za odpowiedź błędną albo brak odpowiedzi.<br>Przykładowa odpowiedź<br>funkcja sumadz(n) {<br>suma = 1<br>i = 2<br>dopóki (i*i &lt;= n)<br>jeżeli (n mod i = 0)<br>suma = suma + i<br>jeżeli (n div i != i)<br>suma = suma + n/i<br>i = i + 1<br>zwróć suma<br>}<br>x = sumadz(a)<br>y = sumadz(x-1)<br>jeżeli (y-1 = a)<br>wypisz x-1<br>w przeciwnym wypadku<br>wypisz „NIE”</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Algorytm (pseudokod):</strong></p>\n<p>funkcja sumadz(n):<br>suma ← 1<br>i ← 2<br>dopóki i*i ≤ n wykonuj:<br>jeżeli n mod i = 0:<br>suma ← suma + i<br>jeżeli n div i ≠ i:<br>suma ← suma + n div i<br>i ← i + 1<br>zwróć suma</p>\n<p>x ← sumadz(a) // x = suma dzielników właściwych a; szukamy b takiego, że b = x - 1<br>b ← x - 1<br>jeżeli b &gt; 1:<br>y ← sumadz(b)<br>jeżeli y = a + 1:<br>wypisz b<br>w przeciwnym razie:<br>wypisz &quot;NIE&quot;<br>w przeciwnym razie:<br>wypisz &quot;NIE&quot;</p>\n<h4>Sposób 1 - wykorzystanie symetrii definicji</h4>\n<p><strong>Idea kluczowa:</strong> definicja skojarzenia mówi <code>sumadz(a) = b + 1</code>, więc skoro znamy a, możemy <strong>wyliczyć kandydata</strong> <code>b = sumadz(a) - 1</code>. Potem wystarczy sprawdzić drugi warunek: czy <code>sumadz(b) = a + 1</code>.</p>\n<p><strong>Krok po kroku:</strong></p>\n<ol><li>Oblicz <code>x = sumadz(a)</code>. To koszt O(√a).</li><li>Kandydat: <code>b = x - 1</code>.</li><li>Jeśli <code>b ≤ 1</code>, brak skojarzenia (b musi być &gt; 1 z definicji).</li><li>Oblicz <code>y = sumadz(b)</code>. To koszt O(√b).</li><li>Jeśli <code>y = a + 1</code> - wypisz b. W przeciwnym razie wypisz „NIE”.</li></ol>\n<p>To daje algorytm O(√a + √b), czyli <strong>O(√n)</strong> ogólnie.</p>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>def sumadz(n):<br>if n &lt; 2:<br>return 0<br>suma = 1<br>i = 2<br>while i * i &lt;= n:<br>if n % i == 0:<br>suma += i<br>if n // i != i:<br>suma += n // i<br>i += 1<br>return suma</p>\n<p>def skojarzona(a):<br>x = sumadz(a)<br>b = x - 1<br>if b &lt;= 1:<br>return &quot;NIE&quot;<br>if sumadz(b) == a + 1:<br>return b<br>return &quot;NIE&quot;</p>\n<p>print(skojarzona(75)) # 48<br>print(skojarzona(140)) # 195<br>print(skojarzona(20)) # NIE</p>\n<p><strong>C++:</strong><br>```cpp<br>#include &lt;iostream&gt;<br>using namespace std;</p>\n<p>long long sumadz(long long n) {<br>if (n &lt; 2) return 0;<br>long long s = 1;<br>for (long long i = 2; i * i &lt;= n; i++) {<br>if (n % i == 0) {<br>s += i;<br>if (n / i != i) s += n / i;<br>}<br>}<br>return s;<br>}</p>\n<p>int main() {<br>long long a; cin &gt;&gt; a;<br>long long x = sumadz(a);<br>long long b = x - 1;<br>if (b &gt; 1 &amp;&amp; sumadz(b) == a + 1) cout &lt;&lt; b;<br>else cout &lt;&lt; &quot;NIE&quot;;<br>return 0;<br>}</p>\n<p><strong>Pascal:</strong><br>```pascal<br>function Sumadz(n: LongInt): LongInt;<br>var s, i: LongInt;<br>begin<br>if n &lt; 2 then begin Sumadz := 0; Exit end;<br>s := 1;<br>i := 2;<br>while i * i &lt;= n do begin<br>if n mod i = 0 then begin<br>s := s + i;<br>if n div i &lt;&gt; i then s := s + n div i;<br>end;<br>i := i + 1;<br>end;<br>Sumadz := s;<br>end;</p>\n<p>var a, x, b: LongInt;<br>begin<br>Readln(a);<br>x := Sumadz(a);<br>b := x - 1;<br>if (b &gt; 1) and (Sumadz(b) = a + 1) then Writeln(b)<br>else Writeln(&#x27;NIE&#x27;);<br>end.</p>\n<h4>Reference informatyczny - suma dzielników w O(√n)</h4>\n<blockquote>Reference - Wyznaczanie sumy dzielników:<br>- <strong>Trywialne O(n)</strong>: iteruj i od 1 do n-1, jeśli n mod i = 0 dodaj i. Za wolne dla dużych n.<br>- <strong>O(√n)</strong>: iteruj i od 2 do √n. Każdy dzielnik d &lt; √n ma parę n/d &gt; √n. Sprawdzamy <code>i*i ≤ n</code> (nie <code>i ≤ sqrt(n)</code> - żeby uniknąć błędów float).<br>- <strong>Pułapka kwadratu doskonałego</strong>: gdy <code>i = n/i</code> (np. n=36, i=6), nie dodawaj dwa razy.<br>- <strong>1 jest zawsze dzielnikiem</strong> liczby &gt; 1, dlatego inicjujemy <code>suma = 1</code>.<br>- <strong>Liczby doskonałe</strong> (perfect numbers): liczby gdzie suma dzielników właściwych = sama liczba. Przykład: 6 = 1+2+3, 28 = 1+2+4+7+14.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 1.2, max 4 pkt):<br>- <strong>3 pkt</strong> za poprawne obliczanie sumy dzielników:<br>- 1 pkt - sumowanie dzielników<br>- 1 pkt - poprawna konstrukcja pętli<br>- 1 pkt - złożoność <strong>nie gorsza niż O(√n)</strong><br>- <strong>1 pkt</strong> za poprawne ustalenie b oraz sprawdzenie warunku skojarzenia<br>- <strong>0 pkt</strong> za odpowiedź błędną</blockquote>\n<p><strong>WAŻNE - warunek z treści zadania:</strong> &quot;Przy ocenie będzie brana pod uwagę liczba operacji arytmetycznych&quot;. Stąd O(√n), nie O(n).</p>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Złożoność O(n)</strong> zamiast O(√n) - utrata 1 pkt. Pętla <code>dla i = 1 do n-1</code> to klasyczna pułapka.</li><li><strong>Liczenie pary (i, n/i) dwa razy</strong> dla kwadratu doskonałego - wynik zawyżony.</li><li><strong>Pomijanie 1</strong> w sumie - wtedy suma zawsze o 1 mniejsza.</li><li><strong>Próba enumerowania wszystkich b</strong> od 2 do M - nieoptymalne; lepiej skorzystać z <code>b = sumadz(a) - 1</code>.</li><li><strong>Pomylenie definicji</strong> - w zadaniu jest <code>+1</code> po obu stronach, nie jak w klasycznych amicable numbers gdzie suma a = b a suma b = a.</li><li><strong>Pominięcie warunku <code>b &gt; 1</code></strong> - z definicji a i b &gt; 1.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li><code>sumadz(n)</code>: pętla i = 2 do √n → <strong>O(√n)</strong> operacji.</li><li>Cały algorytm: 2 wywołania sumadz → <strong>O(√a + √b) = O(√n)</strong>.</li><li><strong>Liczba operacji arytmetycznych</strong>: rzędu 2√a (porównanie + mod + dodawanie w każdej iteracji).</li></ul>"}]}