Pagini recente » Cod sursa (job #2185728) | Cod sursa (job #1144493) | Cod sursa (job #1848640) | Cod sursa (job #1692607) | Cod sursa (job #2670982)
#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;
}