Cod sursa(job #108245)
#include <stdio.h>
struct stare{long int x,y;} p1,p2,p;
long int a,b,x,y,z,m,l,i,j,k,ax1,ax2,mat[10000][2];
long long n;
int main()
{
freopen("rsir.in","r",stdin);
freopen("rsir.out","w",stdout);
scanf("%ld %ld %ld %ld %ld %ld %ld %ld %lld",&p1.x,&p1.y,&a,&b,&x,&y,&z,&m,&n);
for (i=0;i<10000;i++)
{
mat[i][0]=(i*i*a + i*x)%m;
mat[i][1]=(i*i*b + i*y)%m;
}
if (n==0) printf("%ld",p1.x);
if (n==1) printf("%ld",p1.y);
p2=p1;
p1.x%=m;p2.x%=m;
p1.y%=m;p2.y%=m;
ax1=p1.x;ax2=p1.y;
p1.x=p1.y;
p1.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p1.y>m) p1.y-=m;
ax1=p2.x;ax2=p2.y;
p2.x=p2.y;
p2.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p2.y>m) p2.y-=m;
ax1=p2.x;ax2=p2.y;
p2.x=p2.y;
p2.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p2.y>m) p2.y-=m;
if (n==2) printf("%ld",p1.y);
for (i=2;(p1.x!=p2.x)||(p1.y!=p2.y) ;i++)
{
ax1=p1.x;ax2=p1.y;
p1.x=p1.y;
p1.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p1.y>m) p1.y-=m;
ax1=p2.x;ax2=p2.y;
p2.x=p2.y;
p2.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p2.y>m) p2.y-=m;
ax1=p2.x;ax2=p2.y;
p2.x=p2.y;
p2.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p2.y>m) p2.y-=m;
if (i==n) {printf("%ld",p1.y);return 0;}
}
p=p1;
ax1=p1.x;ax2=p1.y;
p1.x=p1.y;
p1.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p1.y>m) p1.y-=m;
++i;
for (l=1;(p1.x!=p.x)||(p1.y!=p.y);i++,l++)
{
ax1=p1.x;ax2=p1.y;
p1.x=p1.y;
p1.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p1.y>m) p1.y-=m;
if (i==n) {printf("%ld",p1.y);return 0;}
}
n-=i;
k=n%l;
for (i=1;i<=k;i++)
{
ax1=p1.x;ax2=p1.y;
p1.x=p1.y;
p1.y=( mat[ax1][0] + mat[ax2][1] + z);
while (p1.y>m) p1.y-=m;
}
// printf("%ld %ld %ld\n",p.x,p.y,l);
printf("%ld",p1.y);
return 0;
}