Cod sursa(job #108245)

Utilizator devilkindSavin Tiberiu devilkind Data 21 noiembrie 2007 22:36:32
Problema Rsir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#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;
}