Pagini recente » Cod sursa (job #277650) | Cod sursa (job #1135281) | Cod sursa (job #2687448) | Cod sursa (job #3121866) | Cod sursa (job #812151)
Cod sursa(job #812151)
#include <fstream>
#define MAX 7500
using namespace std;
struct stare
{
int ago[2];
}f, s, N;
int R0[MAX], R1[MAX], n, M, x, y, a, b, z, T0, T1, pas, coada, ciclu;
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++)
{
int patrat = i * i;
R0[i] = (a * patrat + x * i) % M;
R1[i] = (b * patrat + y * i) % 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;
ofstream out("rsir.out");
while(!pas || (f.ago[0] != s.ago[0] && f.ago[1] != s.ago[1]))
{
//out<<pas<<": "<<s.ago[0]<<" "<<s.ago[1]<<"\n";
GoNext(s);
GoNext(f);//out<<" "<<f.ago[0]<<" "<<f.ago[1]<<"\n";
if(pas && f.ago[0] == s.ago[0] && f.ago[1] == s.ago[1]) break;
GoNext(f);//out<<" "<<f.ago[0]<<" "<<f.ago[1]<<"\n";
pas++;
if(pas > 10000) break;
}
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 + 1, N);
out<<N.ago[1]; out.close();
return 0;
}