# PBinfo #3333 – bookface – Rezolvare C++

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

## Enunț

Cerința
Se dau n numere naturale nenule. Pentru fiecare număr dat a să se calculeze suma divizorilor lui a2.

Date de intrare
Fișierul de intrare bookface.in conține pe prima linie numărul n, iar pe a doua linie cele n numere naturale.  

Date de ieșire
Fișierul de ieșire bookface.out va conține pe linia i suma cerută pentru cel de-al i-lea număr.

Restricții și precizări

1 ≤ n ≤ 50.000
cele n numere date sunt nenule, mai mici decât 1.000.000

Exemplu:
bookface.in

3
2 4 3
bookface.out

7
31
13
Explicație
Suma divizorilor numerelor 4, 16, 9 este 7, 31, respectiv 13.

## Cod sursă C++

```cpp
#include <fstream>
#define N 1000001
using namespace std;
ifstream f("bookface.in");
ofstream g("bookface.out");
long long n;
long long s[N], p[N], prim[N];
void brut()
{
    long long i, j, a, b, suma;
    for(i = 1; i <= n; i++)
    {
        f >> a;
        b = a*a;
        suma = a;
        for(j = 1; j < a; j++)
            if(b%j==0) suma += j + b/j;
        g << suma << "\n";
    }
}
void soft()
{
    long long i, j, k, pu, a;
    s[1] = 1;
    for(i = 2; i < 1000000; i++)
    if(p[i]==0)
    {
        s[i] = 1+i+i*i;
        prim[i] = i;
        j = i+i;
        while(j < 1000000)
        {
            p[j] = 1;
            prim[j] = i;
            j = j+i;
        }
    }
    else
    {
        j = i/prim[i];
        if(j%prim[i]!=0)
        {
            s[i] = s[j]*(1+prim[i]+prim[i]*prim[i]);
        }
        else
        {
            j = i;
            pu = 1;
            while(j%prim[i]==0)
            {
                j = j/prim[i];
                pu = pu*prim[i];
            }
            s[i] = s[j]*(pu*pu*prim[i]-1)/(prim[i]-1);
        }
    }
    for(i = 1; i <= n; i++)
    {
        f >> a;
        g << s[a] << "\n";
    }
}
int main()
{
    f >> n;
    //brut();
    soft();
    return 0;
}
```

## Resurse

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