# PBinfo #3302 – suminvdiv – Rezolvare C++

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

## Enunț

Cerința
Pe prima linie a fișierului suminvdiv.in se găsesc cel mult 1000 de numere naturale distincte mai mici decât 10.000.000.000. Scrieți un program care determină pentru fiecare număr citit x suma \( s= 1/{d}_{1} + 1/{d}_{2} + .. + 1/{d}_{i} \), unde \( {d}_{1}, {d}_{2}, …., {d}_{i}  \) sunt divizorii numărului x. Valorile determinate se  vor afișa separate printr-un spațiu.

Date de intrare
Fișierul de intrare suminvdiv.in conține pe prima linie cel mult 1000 de numere naturale distincte mai mici decât 10.000.000.000 separate prin spații.

Date de ieșire
Fișierul de ieșire suminvdiv.out va conține pe prima linie valorile determinate cu exact 2 zecimale pentru fiecare număr x din fișierul de intrare, valori separate printr-un spațiu.

Restricții și precizări

pe prima linie a fișierului sunt cel mult 1000 de numere
numerele de pe prima linie a fișierului de intrare sunt mai mici decât 10.000.000.000
rezultatul este considerat corect dacă diferența dintre fiecare valoare afișată și cea corectă este mai mică decât 0.01

Exemplu:
suminvdiv.in

12 9 123 78 34 278313 349012 6 24242 900000
suminvdiv.out

2.33 1.44 1.37 2.15 1.59 1.58 1.75 2.00 1.71 3.55
Explicație

Divizorii lui 12 sunt: 1, 2, 3, 4, 6 și 12……\(s=( \frac{1}{1} + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} + \frac{1}{6} + \frac{1}{12}) = 2.33\)
Divizorii lui 9 sunt: 1, 3 și 9……\(s=( \frac{1}{1} + \frac{1}{3} + \frac{1}{9}) = 1.44\), etc.

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
ifstream f("suminvdiv.in");
ofstream g("suminvdiv.out");
#define ull unsigned long long
double SumDivInv(ull n, ull s)
{
    double rez = (double)(s)*1.0 / (double)(n);
    return rez;
}
ull SumDiv(ull n)
{
    ull d = 2, k, s=1, p;
    while(n > 1)
    {
        k = 0;
        p = 1;
        while(n % d == 0)
            k++,p*=d,n/=d;
        if(k)
            s = s * (p * d - 1)/(d - 1);
        d++;
        if(n > 1 && d * d > n)
            d = n;
    }
    return s;
}
int main()
{
    ull x;
    while(f>>x)
    {
        ull z = SumDiv(x);
        g << fixed << setprecision(2)<< SumDivInv(x, z)<<' ';
    }
    return 0;
}
```

## Resurse

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