Pagini recente » Cod sursa (job #335468) | Cod sursa (job #2941539)
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("rsir.in");
ofstream g("rsir.out");
struct coord
{
long long minus_one, minus_two;
};
int t1,t2;
int a,b;
int x,y,z;
int m;
int val;
int precalc1[7005],precalc2[7005];
long long n;
inline int nextNumber(long long &tminusone,long long &tminustwo)
{
val = precalc1[tminusone] + precalc2[tminustwo];
if(val >= m)
val = val - m;
return val;
}
void precalc()
{
t1 = t1 % m; t2 = t2 % m; a = a % m; b = b % m; x = x % m; y = y % m; z = z % m;
long long sum;
for(int i=1;i<=m;i++)
{
sum = a * i * i + x * i + z;
sum %= m;
precalc1[i] = sum;
sum = b * i * i + y * i;
sum %= m;
precalc2[i] = sum;
}
}
void solve()
{
coord tortoise,hare;
tortoise.minus_one = t2;
tortoise.minus_two = t1;
hare.minus_one = t2;
hare.minus_two = t1;
int val1 = 0;
int val2 = 0;
while(1)
{
swap(hare.minus_one,hare.minus_two);
hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
swap(hare.minus_one,hare.minus_two);
hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
swap(tortoise.minus_one,tortoise.minus_two);
tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
if(tortoise.minus_one == hare.minus_one && tortoise.minus_two == hare.minus_two)
{
val1 = tortoise.minus_one;
val2 = tortoise.minus_two;
break;
}
}
long long cyclelen = 0;
while(1)
{
cyclelen++;
swap(tortoise.minus_one,tortoise.minus_two);
tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
if(tortoise.minus_one == val1 && tortoise.minus_two == val2)
break;
}
tortoise.minus_one = t2;
tortoise.minus_two = t1;
long long length_before = 0;
while(1)
{
length_before++;
swap(tortoise.minus_one,tortoise.minus_two);
tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
if(tortoise.minus_one == val1 && tortoise.minus_two == val2)
break;
}
tortoise.minus_one = t2;
tortoise.minus_two = t1;
long long pos = n-1;
cyclelen--;
while(length_before > 0 && pos > 0)
{
length_before--;
pos--;
swap(tortoise.minus_one,tortoise.minus_two);
tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
}
n = n % cyclelen;
while(n > 0 && pos>0)
{
n--;
pos--;
swap(tortoise.minus_one,tortoise.minus_two);
tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
}
g<<tortoise.minus_one;
}
void citire()
{
f>>t1>>t2;
f>>a>>b;
f>>x>>y>>z;
f>>m>>n;
}
int main()
{
citire();
precalc();
solve();
}