Pagini recente » Cod sursa (job #1426101) | Cod sursa (job #1734863) | Cod sursa (job #2975827) | Cod sursa (job #475134) | Cod sursa (job #2310615)
#include <iostream>
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream in ("rsir.in");
ofstream out ("rsir.out");
#define ll long long
#define MIN(a , b) (((a) < (b)) ? (a) : (b))
#define MAX(a , b) (((a) < (b)) ? (b) : (a))
int const nmax = 7000;
unordered_map<int , int> frec;
int firstel[5 + nmax];
int secel[5 + nmax];
int main()
{
int t0 , t1 , a , b , x , y , z , modulo ;
ll n;
in >> t0 >> t1 >> a >> b >> x >> y >> z >> modulo >> n;
t0 %= modulo;
t1 %= modulo;
for(int i = 0 ; i <= modulo ; i++)
firstel[i] = (a * i % modulo * i % modulo + x * i % modulo) % modulo;
for(int i = 0 ; i <= modulo ; i++)
secel[i] = (b * i % modulo * i % modulo + y * i % modulo) % modulo;
int initt0 = t0, initt1 = t1;
int lim = 1 , val = 0;
while(true){
//cout << t0 << " " << t1 << '\n';
if(frec[t0 * modulo + t1] == 1) {
val = t0 * modulo + t1;
break;
}
frec[t0 * modulo + t1] = 1;
t0 = firstel[t0] + secel[t1] + z;
if(modulo <= t0)
t0 -= modulo;
if(modulo <= t0)
t0 -= modulo;
swap(t0 , t1);
lim++;
}
t0 = initt0;
t1 = initt1;
int start = 1;
while(true){
if(t0 * modulo + t1 == val)
break;
t0 = firstel[t0] + secel[t1] + z;
if(modulo <= t0)
t0 -= modulo;
if(modulo <= t0)
t0 -= modulo;
swap(t0 , t1);
start++;
}
//cout << start << " " << lim << '\n';
if(start <= n)
n = (n - start) % (lim - start) + start;
t0 = initt0;
t1 = initt1;
for(int i = 2 ; i <= n ; i++){
t0 = firstel[t0] + secel[t1] + z;
if(modulo <= t0)
t0 -= modulo;
if(modulo <= t0)
t0 -= modulo;
swap(t0 , t1);
}
out << t1;
return 0;
}