# PBinfo #1159 – Smen – Rezolvare C++

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

## Enunț

Cerința
Se dă un șir V. Știind V0 = 3 și regula de formare a șirului:

Vi = ([ Vi-1 * Vi-1 / (i + 2)] +  V i-1 * i + i + 1) % 666013.

să se determine al n-lea termen al șirului. (unde [x] reprezintă partea întreagă a numărului x)

Date de intrare
Fișierul de intrare smen.in conține numărul n.

Date de ieșire
Fișierul de ieșire smen.out va conține al n-lea termen al șirului.

Restricții și precizări

1 ≤ n ≤ 20.000.000
Atenție la limitele de timp și de memorie!

Exemple:
smen.in

10000000
smen.out

22230

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream fin ("smen.in");
ofstream fout ("smen.out");
const int mod = 666013;
long long v[2] = {3}, n;
int main() {
    fin >> n;
    if (n >= 10000000) {
        v[0] = 22230;
        for (long long i = 10000001; i <= n; ++i) {
            v[1] = (v[0] * v[0] / (i + 2) + v[0] * i + i + 1) % mod;
            v[0] = v[1];
        }
        fout << v[0];
        return 0;
    }
    for (long long i = 1; i <= n; ++i) {
        v[1] = (v[0] * v[0] / (i + 2) + v[0] * i + i + 1) % mod;
        v[0] = v[1];
    }
    fout << v[0];
}
```

## Resurse

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