Pagini recente » Cod sursa (job #321626) | Cod sursa (job #1697978) | Cod sursa (job #716735) | Cod sursa (job #2443619) | Cod sursa (job #2159320)
#include <bits/stdc++.h>
#define x first
#define y second
#define MaxN 100000
#define int64 long long
using namespace std;
bitset<6000> deja[6000];
int T[MaxN+1][2];
int main(){
FILE* fin = fopen("rsir.in","r");
FILE* fout = fopen("rsir.out","w");
int i,T0,T1,Tx,Ty,Tz,a,b,x,y,z,P,M,f1,f2,ff,w;
int64 N;
fscanf(fin,"%d%d %d%d %d%d%d %d %lld",&T0,&T1,&a,&b,&x,&y,&z,&M,&N);
T0 = T0 % M;
T1 = T1 % M;
deja[T0][T1] = 1;
T[0][0] = T0;
T[0][1] = T1;
Tx = T0;
Ty = T1;
for(P = 2; P <= M * M; ++P)
{
Tz = (a * (1LL * Tx * Tx) % M + b * (1LL * Ty * Ty) % M + (x * Tx) + (y * Ty) + z) % M;
Tx = Ty;
Ty = Tz;
if(P % 500 == 0) T[P / 500][0] = Tx, T[P / 500][1] = Ty;
if(deja[Tx][Ty]) { f1 = Tx; f2 = Ty; break; }
deja[Tx][Ty] = 1;
}
if(f1 == T0 && f2 == T1) ff = 1;
else
{
Tx = T0;
Ty = T1;
for(w = 2; w <= M * M; ++w)
{
Tz = (a * (1LL * Tx * Tx) % M + b * (1LL * Ty * Ty) % M + (x * Tx) + (y * Ty) + z) % M;
Tx = Ty;
Ty = Tz;
if(Tx == f1 && Ty == f2) { ff = w; break; }
}
}
int pos, remain;
P = P - ff;
N = ff - 1 + (N - ff + 1) % P;
if(ff == 1 && !N && N < 500) { fprintf(fout, "%d\n", T[0][0]); return 0; }
pos = N / 500;
remain = N % 500;
Tx = T[pos][0];
Ty = T[pos][1];
if(!pos) --remain;
while(remain--)
{
Tz = (a * (1LL * Tx * Tx) % M + b * (1LL * Ty * Ty) % M + (x * Tx) + (y * Ty) + z) % M;
Tx = Ty;
Ty = Tz;
}
fprintf(fout, "%d\n", Ty);
return 0;
}