Cod sursa(job #1684986)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 11 aprilie 2016 13:43:31
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
using namespace std;
long long n;
int t0,t1,t2,a,b,x,y,z,m;
int l,s;


inline void next(int &p0,int &a0,int &p1,int &a1)
{
    int p2=(a*a0%m + b*a1%m + x*p0 + y*p1 +z)%m;
    p0=p1;a0=a1;
    p1=p2;a1=p1*p1%m;
}
int main()
{
    int i,j;
    freopen("rsir.in","r",stdin);
    freopen("rsir.out","w",stdout);
    scanf("%d %d",&t0,&t1);
    scanf("%d %d %d %d %d %d %lld",&a,&b,&x,&y,&z,&m,&n);
    if (n==0) {
        printf("%d\n",t0);
        return 0;
    }
    if (n==1) {
        printf("%d\n",t1);
        return 0;
    }
    int p0,p1,q0,q1;
    int a0,a1,b0,b1;


    p0=t0%m;p1=t1%m;
    a0=p0*p0%m;
    a1=p1*p1%m;

    q0=t0%m;q1=t1%m;
    b0=q0*q0%m;
    b1=q1*q1%m;


    for (i=2,j=2;;i++,j+=2) {
        next(p0,a0,p1,a1);

        next(q0,b0,q1,b1);
        next(q0,b0,q1,b1);

        if (p0==q0&&p1==q1) {
            l=j-i+1;
            break;
        }
    }
    s=i;

    p0=t0%m;p1=t1%m;
    a0=p0*p0%m;
    a1=p1*p1%m;

    q0=t0%m;q1=t1%m;
    b0=q0*q0%m;
    b1=q1*q1%m;

    for (i=1;i<=l;i++)
        next(q0,b0,q1,b1);
    for (s=1;;s++) {
        if (p0==q0&&p1==q1)
            break;
        next(p0,a0,p1,a1);
        next(q0,b0,q1,b1);
    }
    p0=t0%m;p1=t1%m;
    a0=p0*p0%m;
    a1=p1*p1%m;

    s--;
    if (n<=s) {
        for (i=1;i<=n;i++)
            next(p0,a0,p1,a1);
    }
    else {
        n=s+(n-s)%l;
        for (i=1;i<=n;i++)
            next(p0,a0,p1,a1);
    }

    printf("%d\n",p0);

    return 0;
}