Pagini recente » Cod sursa (job #1378590) | Cod sursa (job #1360889) | Cod sursa (job #2785093) | Cod sursa (job #2132999) | Cod sursa (job #526157)
Cod sursa(job #526157)
#include <stdio.h>
#define NMAX 7005
#define ll long long
int t0,t1,a,b,x,y,z,m;
ll n,ind1,ind2;
int h,g,A[NMAX],B[NMAX],C[NMAX],D[NMAX];
int t2,t3,steps;
void precompute()
{
int i;
for (i=0; i<m; i++)
{
A[i]=(((i*i)%m)*a)%m;
B[i]=(((i*i)%m)*b)%m;
C[i]=(i*x)%m;
D[i]=(i*y)%m;
}
}
inline int next_val(int v1,int v2)
{
int act=0;
act=A[v1]+B[v2];
if (act>=m) act-=m;
act+=C[v1];
if (act>=m) act-=m;
act+=D[v2];
if (act>=m) act-=m;
act+=z;
if (act>=m) act-=m;
return act;
}
int main()
{
freopen("rsir.in","r",stdin);
freopen("rsir.out","w",stdout);
scanf("%d%d%d%d%d%d%d%d%lld",&t0,&t1,&a,&b,&x,&y,&z,&m,&n);
t0%=m; t1%=m;
h=t0; g=t1;
precompute();
int i,val;
ind1=ind2=1;
t2=t0; t3=t1;
while (1)
{
ind1++;
val=next_val(t0,t1);
t0=t1; t1=val;
if (ind1==n)
{
printf("%d\n",val);
return 0;
}
ind2+=2;
val=next_val(t2,t3);
t2=t3; t3=val;
val=next_val(t2,t3);
t2=t3; t3=val;
if (t0==t2 && t1==t3)
{
while (1)//lungimea cliclului
{
val=next_val(t2,t3);
t2=t3; t3=val;
steps++;
if (t2==t0 && t3==t1)
break ;
}
ind2=1;
t2=h; t3=g;
while (1)
{
ind1++; ind2++;
val=next_val(t0,t1);
t0=t1; t1=val;
val=next_val(t2,t3);
t2=t3; t3=val;
if (t0==t2 && t3==t1) //de la ind2 incepe ciclul
break ;
}
n-=ind2-1;//scad ce nu face parte din ciclu
n%=steps;
if (n==0) n+=steps;
for (i=1; i<n; i++)
{
val=next_val(t0,t1);
t0=t1; t1=val;
}
printf("%d\n",val);
break ;
}
}
return 0;
}