Cod sursa(job #108220)

Utilizator devilkindSavin Tiberiu devilkind Data 21 noiembrie 2007 22:02:13
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>

struct stare{long long x,y;} p1,p2,p;

long long a,b,x,y,z,m,l,i,j,k,ax1,ax2;
long long n;

int main()
{
        freopen("rsir.in","r",stdin);
        freopen("rsir.out","w",stdout);

        scanf("%lld %lld %lld %lld %lld %lld %lld %lld %lld",&p1.x,&p1.y,&a,&b,&x,&y,&z,&m,&n);

        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=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;

        ax1=p2.x;ax2=p2.y;
        p2.x=p2.y;
        p2.y=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;

        ax1=p2.x;ax2=p2.y;
        p2.x=p2.y;
        p2.y=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;



        for (i=2;(p1.x!=p2.x)||(p1.y!=p2.y) ;i++)
                {
                ax1=p1.x;ax2=p1.y;
                p1.x=p1.y;
                p1.y=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;

                ax1=p2.x;ax2=p2.y;
                p2.x=p2.y;
                p2.y=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;

                ax1=p2.x;ax2=p2.y;
                p2.x=p2.y;
                p2.y=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;

                if (i==n) {printf("%lld",p1.y);return 0;}
                }

         p=p1;
         ax1=p1.x;ax2=p1.y;
         p1.x=p1.y;
         p1.y=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%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=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;
                if (i==n) {printf("%lld",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=(ax1*ax1*a + ax2*ax2*b + ax1*x + ax2*y + z)%m;
                }
  //      printf("%ld %ld %ld\n",p.x,p.y,l);
        printf("%lld",p1.y);
        return 0;
}