Pagini recente » Cod sursa (job #2045184) | Cod sursa (job #3202945) | Cod sursa (job #439984) | Cod sursa (job #1126031) | Cod sursa (job #2783173)
#include <bits/stdc++.h>
#define NMAX 7005
using namespace std;
/**********/
// INPUT / OUTPUT
ifstream f("rsir.in");
ofstream g("rsir.out");
/**********/
/// GLOBAL DECLARATIONS
int T0, T1, A, B, X, Y, Z, M, N;
int firstSum[NMAX], secondSum[NMAX];
int ans, cycleLength, length;
pair <int, int> hare, tortoise;
pair <int, int> temp, start;
/**********/
/// FUNCTIONS
void ReadInput();
void Solution();
void Output();
/**********/
///---------------------------------
inline void ReadInput()
{
f >> T0 >> T1 >> A >> B >> X >> Y >> Z >> M >> N;
}
///---------------------------------
pair <int, int> Move(pair <int, int> p)
{
temp.first = p.second;
temp.second = firstSum[p.first] + secondSum[p.second];
if (temp.second >= M) temp.second -= M;
return temp;
}
///---------------------------------
void PrintPair(pair <int, int> p)
{
g << p.first << " " << p.second << "\n";
}
///---------------------------------
inline void Init()
{
T0 %= M, T1 %= M, A %= M, B %= M, X %= M, Y %= M, Z %= M;
start = {T0, T1};
long long sum;
for (int i = 0 ; i < M ; ++ i)
{
sum = 1LL * A * i * i + 1LL * X * i + 1LL * Z;
sum %= M;
firstSum[i] = sum;
sum = 1LL * B * i * i + 1LL * Y * i;
sum %= M;
secondSum[i] = sum;
}
}
///---------------------------------
inline void FindCycleLength()
{
tortoise = start;
hare = Move(start);
while (hare != tortoise)
{
tortoise = Move(tortoise);
hare = Move(Move(hare));
}
cycleLength = 1;
tortoise = Move(tortoise);
while (tortoise != hare)
{
tortoise = Move(tortoise);
cycleLength ++;
}
}
///---------------------------------
inline void FindLength()
{
hare = start;
tortoise = start;
for (int i = 1 ; i <= cycleLength ; ++ i)
hare = Move(hare);
while (hare != tortoise)
{
hare = Move(hare);
tortoise = Move(tortoise);
length ++;
}
}
///---------------------------------
inline void GetAns()
{
if (N <= length)
{
if (N == 0)
{
ans = T0;
return;
}
tortoise = start;
for (int i = 2 ; i <= N ; ++ i)
tortoise = Move(tortoise);
}
else
{
int trip = (N - length) % cycleLength;
if (trip == 0) trip = cycleLength;
for (int i = 2 ; i <= trip ; ++ i)
tortoise = Move(tortoise);
}
ans = tortoise.second;
}
///---------------------------------
inline void Solution()
{
Init();
FindCycleLength();
FindLength();
GetAns();
}
///---------------------------------
inline void Output()
{
g << ans;
}
///---------------------------------
int main()
{
ReadInput();
Solution();
Output();
return 0;
}