Pagini recente » Cod sursa (job #767126) | Cod sursa (job #1815264) | Cod sursa (job #1674758) | Cod sursa (job #1311648) | Cod sursa (job #851232)
Cod sursa(job #851232)
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
#define Nmax 8000
struct State
{
int First, Second;
}Start, One, Two, Ans;
int PrecA[Nmax], PrecB[Nmax], M, X, Y, A, B, Z;
int Steps, Cycle_Length, Tail_Length;
ll N, FirstT, SecondT;
void Advance(State &Now, int Steps)
{
for(; Steps; Steps --)
{
int AuxN = Now.Second;
Now.Second = PrecA[Now.First] + PrecB[Now.Second] + Z;
while(Now.Second >= M) Now.Second -= M;
Now.First = AuxN;
}
}
void GetAns(State &Now, int Steps)
{
Now.First = FirstT % M;
Now.Second = SecondT % M;
--Steps;
for(; Steps; Steps --)
Advance(Now, 1);
}
int main()
{
int i;
ifstream cin("rsir.in");
ofstream cout("rsir.out");
cin >> FirstT >> SecondT >> A >> B >> X >> Y >> Z >> M >> N;
for(i = 0; i < M; i++)
{
ll Now = i * i;
PrecA[i] = 1LL * (Now * A + i * X) % M;
PrecB[i] = 1LL * (Now * B + i * Y) % M;
}
Start.First = One.First = Two.First = FirstT % M;
Start.Second = One.Second = Two.Second = SecondT % M;
while(!Steps || One.First != Two.First || One.Second != Two.Second)
Advance(One, 1), Advance(Two, 2), Steps ++;
while(Start.First != One.First || Start.Second != One.Second)
Advance(Start, 1), Advance(One, 1), Steps ++, Tail_Length ++;
Cycle_Length = Steps - Tail_Length;
if(N <= Tail_Length) GetAns(Ans, N);
else GetAns(Ans, Tail_Length + (N - Tail_Length) % Cycle_Length);
cout << Ans.Second;
return 0;
}