Pagini recente » Cod sursa (job #418519) | Cod sursa (job #279673) | Cod sursa (job #2274445) | Cod sursa (job #2148582) | Cod sursa (job #596310)
Cod sursa(job #596310)
#include <fstream>
#define MMax 7010
using namespace std;
typedef long long ll;
const char IN[]="rsir.in",OUT[]="rsir.out";
ifstream fin(IN);
ofstream fout(OUT);
struct poz{
int x,y;
bool operator!=(poz const &b) const{
return x!=b.x || y!=b.y;
}
};
int T0,T1,a,b,x,y,z,M;
int A[MMax],B[MMax];
int Rez;
ll N;
inline poz next(poz p)
{
static poz ret;
int T1 = p.y , T0 = p.x;
int T2= A[T0] + B[T1] + z;
while (T2>=M) T2-=M;
ret.x=T1;ret.y=T2;
return ret;
}
poz getCycle(poz v)
{
poz p1,p2;
p1 = p2 = v;
p1=next(p1),p2=next(next(p2));
for (; p1!=p2 ;)
p1=next(p1),p2=next(next(p2));
for ( p1 = v ; p1!=p2 ; p1=next(p1) , p2 = next(p2) );
return p1;
}
void solve()
{
poz p,pz={T0,T1};
poz c = getCycle(pz) ;
int lcoada , lciclu ;
//printf("%d\n",c%M);
for ( lcoada = 0 , p=pz ; p!=c ; p=next(p) , ++lcoada);
for ( lciclu = 1 , p=next(c) ; p!=c ; ++lciclu)
p=next(p);
if ( N > lcoada ) N-=lcoada;
else
{
--N;
for ( p=pz ; N-- ; p=next(p));
Rez=p.x;
return;
}
N%=lciclu;
for ( p=c ; N-- ;)
p=next(p);
Rez=p.x;
}
inline void init()
{
int i;
T0%=M;T1%=M;
for (i=0;i<M;++i)
A[i]= (1LL * a * i * i + 1LL * x * i) % M;
for (i=0;i<M;++i)
B[i]= (1LL * b * i * i + 1ll * y * i) % M;
}
int main()
{
fin>>T0>>T1>>a>>b>>x>>y>>z>>M>>N;
fin.close();
init();
solve();
fout<<Rez<<"\n";
fout.close();
return 0;
}