Pagini recente » Cod sursa (job #1727923) | Cod sursa (job #1306708) | Cod sursa (job #1220756) | Cod sursa (job #2593317) | Cod sursa (job #3000875)
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("rsir.in");
ofstream g("rsir.out");
struct coord
{
int 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(int &tminusone,int &tminustwo)
{
val = precalc1[tminustwo] + precalc2[tminusone];
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=0;i<m;i++)
{
sum = 1LL* a * i * i + 1LL * x * i + 1LL * z;
sum %= m;
precalc1[i] = sum;
sum = 1LL * b * i * i + 1LL* 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;
}
cout<<cyclelen<<" "<<length_before;
tortoise.minus_one = t2;
tortoise.minus_two = t1;
long long pos = n-1;
length_before = length_before-1;
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();
}