Cod sursa(job #1679508)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 8 aprilie 2016 00:09:58
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<cstdio>
struct pct{
    int x;
    int y;
}aa,bb,cc;
long long n;
int a,b,c,d,e,m,t1,t2,i,j,n1,n2,v[7010],x[7010];
FILE *f,*g;
void upd( pct &a ){
    pct r;
    r = a;
    int aux = r.y;
    r.y = r.x;
    r.x = v[ a.x ] + x[aux] ;
    if( r.x > m )
        r.x -= m;
    a = r;
}
int main(){
    f=fopen("rsir.in","r");
    g=fopen("rsir.out","w");
    fscanf(f,"%d%d%d%d%d%d%d%d%lld",&t1,&t2,&a,&b,&c,&d,&e,&m,&n);
    t1 %= m;
    t2 %= m;
    a %= m;
    b %= m;
    c %= m;
    d %= m;
    e %= m;
    aa.x = bb.x = t2;
    aa.y = bb.y = t1;
    for(i=0;i<=m;i++){
        v[i] = ( 1LL * b * i * i + d * i + e ) % m;
        x[i] = ( 1LL * a * i * i + c * i ) % m;
    }
    do{
        upd( aa );
        upd( bb );
        upd( bb );
    }while( aa.x != bb.x || aa.y != bb.y );
    bb = aa;
    do{
        upd( bb );
        n1++;
    }while( aa.x != bb.x || aa.y != bb.y );
    aa.x = bb.x = t2;
    aa.y = bb.y = t1;
    for(i=2;i<=n1+1;i++){
        upd(aa);
    }
    while( aa.x != bb.x || aa.y != bb.y ){
        upd( aa );
        upd( bb );
        n2++;
    }
    bb = aa;
    aa.x = t2;
    aa.y = t1;
    if( n2 >= n ){
        for(i=1;i<=n;i++){
            upd( aa );
        }
        fprintf(g,"%d",aa.y);
        return 0;
    }
    n -= n2;
    n %= n1;
    for(i=1;i<=n;i++){
        upd( bb );
    }
    fprintf(g,"%d",bb.y);
    fclose(f);
    fclose(g);
    return 0;
}