Cod sursa(job #2670982)

Utilizator KPP17Popescu Paul KPP17 Data 11 noiembrie 2020 09:05:06
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#define fisier "recurenta"
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int P = 3500, MOD = 1000000007;
int D[P*P] = {0, 1, 2};
#include <utility>
using pair = std::pair<int, int>;
#define x pos.first
#define y pos.second
#include <vector>
int main()
{
    int
    n, p, a, b, c,
    L = 0, I = 0, B = 0, R = 0;
    in >> n >> p >> a >> b >> c;
    pair pos = {1, 1};
    std::vector<pair> S = {{p, 0}, {1, 1}, {1, 2}};
    for (int i = 3;; i++)
    {
        pos = {(a*y + b*x + c) % p, x};
        if (x == 1 and y == 1)
            if (L) break; else
                L = i - 2;
        while (S.size() and S.back().first <= x)
            S.pop_back();
        D[i] = ((long long)x * (i - S.back().second)) % MOD + D[S.back().second];
        D[i] %= MOD;
        S.push_back({x, i});
    }
    S = std::vector<pair>(S.begin() + 1, S.end());
    const int C = n / L, M = n % L, G = C? (C-2) * (C-1) >> 1: 0, F = L * S.front().first;
    for (int l = 1; l <= L; l++)
    {
        (I += D[L + l - 1]) %= MOD;
        (B += D[l]) %= MOD;
        if (l == M)
        {
            (R += B) %= MOD;
            if (C)
                (R += I) %= MOD;
            for (int c = 1; c < C; c++)
                (R += l * S.front().first) %= MOD;
        }
    }
    for (int c = 0; c < C; c++)
    {
        (R += B) %= MOD;
        if (c < C - 1)
            (R += I) %= MOD;
    }
    for (int g = 0; g < G; g++)
        (R += F) %= MOD;
    out << R;
}