Yechim tahlili

Sehrli juftliklar

Muallif: __thecrash__

Berilgan \(n\) ta elementdan iborat \(a_1, a_2, \dots, a_n\) massivdan shunday \((i, j)\) indekslar juftligini topish kerakki, bunda \(1 \le i < j \le n\) shart bajarilsin va ularning yig'indisi \((a_i + a_j)\) juft son bo'lsin. Jami shunday "Sehrli juftliklar" sonini topish talab etiladi.

Asosiy g'oya (Matematik yondashuv):

Ikkita sonning yig'indisi \((a_i + a_j)\) qachon juft son bo'ladi? Buni bilish uchun ularning juft yoki toqligini tekshirish kifoya:

  • Juft + Juft = Juft
  • Toq + Toq = Juft
  • Juft + Toq = Toq (bu bizga mos kelmaydi)

Demak, yig'indi juft chiqishi uchun tanlab olingan ikkita sonning ikkalasi ham juft bo'lishi yoki ikkalasi ham toq bo'lishi kerak.

Algoritm:

1. Massivdagi barcha sonlarni qarab chiqamiz va ularning nechtasi juft, nechtasi toq ekanini sanab olamiz:

  • Juft sonlar sonini saqlash uchun even_count o'zgaruvchisini ochamiz.
  • Toq sonlar sonini saqlash uchun odd_count o'zgaruvchisini ochamiz.

2. Juft sonlardan juftlik hosil qilish:
Agar massivda \(E\) ta juft son bo'lsa, ulardan ikkitasini tanlash usullari soni kombinatsealar formulasiga ko'ra \(E \times (E - 1) / 2\) ta bo'ladi.

3. Toq sonlardan juftlik hosil qilish:
Agar massivda \(O\) ta toq son bo'lsa, ulardan ikkitasini tanlash usullari soni \(O \times (O - 1) / 2\) ta bo'ladi.

4. Jami "Sehrli juftliklar" soni shu ikki qiymatning yig'indisiga teng:

\(\frac{E \times (E - 1)}{2} + \frac{O \times (O - 1)}{2}\)

Murakkablik:

Vaqt murakkabligi: \(O(n)\) — massivni bir marta to'liq ko'rib chiqib, juft va toq sonlar sanog'i topiladi. Bu \(n \le 2 \times10^5\) cheklovi uchun juda tez ishlaydi va vaqt chegarasiga bemalol ulguradi.
Xotira murakkabligi: \(O(1)\) yoki \(O(n)\) — massivni xotirada saqlash uchun (agar elementlarni birma-bir o'qib ketilsa, qo'shimcha massiv ham talab etilmaydi).

Navbatdagi musobaqa