Pagini recente » Cod sursa (job #1806280) | Cod sursa (job #1454550) | Cod sursa (job #1610984) | Cod sursa (job #117618) | Cod sursa (job #812206)
Cod sursa(job #812206)
#include <fstream>
#define MAX 7500
#define ll long long
using namespace std;
struct stare
{
int ago[2];
}f, s, N;
int R0[MAX], R1[MAX], M, x, y, a, b, z, pas, coada, ciclu;
ll n, T0, T1;
void GoNext(stare &a)
{
int aux = a.ago[1];
a.ago[1] = R0[a.ago[0]] + R1[a.ago[1]] + z;
while(a.ago[1] >= M) a.ago[1] -= M;
a.ago[0] = aux;
}
void getVal(int pas, stare &v)
{
v.ago[1] = T1 % M; v.ago[0] = T0 % M;
for(int i = 1; i < pas; i++)
GoNext(v);
}
void init()
{
for(int i = 0; i < M; i++)
{
ll patrat = i * i;
R0[i] = (patrat * a + x * i) % (ll)M;
R1[i] = (patrat * b + y * i) % (ll)M;
}
}
int main()
{
ifstream in("rsir.in");
in>>T0>>T1>>a>>b>>x>>y>>z>>M>>n;
in.close();
init();
N.ago[0] = f.ago[0] = s.ago[0] = T0 % M;
N.ago[1] = f.ago[1] = s.ago[1] = T1 % M;
while(!pas || f.ago[0] != s.ago[0] || f.ago[1] != s.ago[1])
{
GoNext(s);
GoNext(f);
GoNext(f);
pas++;
}
while(N.ago[0] != f.ago[0] || N.ago[1] != f.ago[1])
{
GoNext(N); GoNext(f);
pas++;
coada++;
}
ciclu = pas - coada;
if(n <= coada)
getVal(n, N);
else
getVal(coada + (n - coada) % ciclu, N);
ofstream out("rsir.out"); out<<N.ago[1]; out.close();
return 0;
}