# PBinfo #2487 – countbits – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

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

## Cod sursă C++

```cpp
#include <fstream>
#define inFile  "countbits.in"
#define outFile "countbits.out"
using namespace std;
int a[32768];
/// a[i]=numarul bitilor de 1 din reprezentarea in baza 2 a lui i
void Precalc()
{
    int i, cnt, x;
    a[0] = 0;
    a[1] = 1;
    for (i = 2; i <= 32767; i++)
    {
        x = i;
        cnt = 0;
        while (x > 0)
        {
            cnt++;
            x = (x & (x - 1));
        }
        a[i] = cnt;
    }
}
int main()
{
    int i, n, A, B, C, D, E, f1, f2, f3, P;
    int cnt;
    P = (1 << 15);
    Precalc();
    ifstream fin(inFile);
    ofstream fout(outFile);
    fin >> n >> A >> B >> C >> D >> E;
    f1 = A; f2 = B;
    cnt = a[f1 % P] + a[f1 / P] + a[f2 % P] + a[f2 / P];
    for (i = 3; i <= n; i++)
    {
        f3 = 1 + (1LL*f1*C + 1LL*f2*D) % E;
        cnt += (a[f3 % P] + a[f3 / P]);
        f1 = f2;
        f2 = f3;
    }
    fout << cnt << "\n";
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2487)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2487/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2487/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
