2487 - countbits

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Se consideră un șir de numere naturale f[1], f[2], …, f[n]. Fiecărui element al șirului i se calculează numărul biților de 1 din reprezentarea în baza 2. De exemplu, numărul 15 are 4 biți de 1 în baza 2.

Cerința

Să se determine numărul total de biți de 1 al tuturor numerelor din șir.

Date de intrare

Fișierul de intrare countbits.in conține pe prima linie numerele n, A, B, C, D, E, unde n este numărul elementelor șirului. Șirul se va genera astfel: f[1] = A, f[2] = B, apoi pentru orice i = 3..n, f[i] = 1 + (f[i-2] * C + f[i-1] * D) % E.

Date de ieșire

Fișierul de ieșire countbits.out va conține pe prima linie un singur număr, reprezentând numărul total de biți de 1 al tuturor numerelor din șir.

Restricții și precizări

3 ≤ n ≤ 15 000 000 3 ≤ A, B, C, D ≤ 100 000 000 3 ≤ E ≤ 1 000 000 000 Atenție la generarea elementelor șirului ==Exemplu==: countbits.in

4 7 11 15 19 8999 countbits.out

17

Rezolvare

def count_set_bits(num):

   count = 0
   while num:
       count += num & 1
       num >>= 1
   return count
Citire date de intrare

with open("countbits.in", "r") as file:

   n, A, B, C, D, E = map(int, file.readline().split())
Generare șir și calcul număr total de biți de 1

total_bits = 0 f = [A, B] for i in range(3, n + 1):

   next_element = 1 + (f[i - 2] * C + f[i - 1] * D) % E
   f.append(next_element)
   total_bits += count_set_bits(next_element)
Scrierea rezultatului în fișierul de ieșire

with open("countbits.out", "w") as file:

   file.write(str(total_bits) + "\n")