Cod sursa(job #1153722)

Utilizator omerOmer Cerrahoglu omer Data 25 martie 2014 17:54:22
Problema Rsir Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
const int MM=100000;
using namespace std;
FILE *f,*g;

int a,b,x,y,z,M; long long n;  //variabile din recurenta

long long coada, perioada;

int aux[MM][2], A[MM],B[MM];

void read(void){

    f=fopen("rsir.in","r");
    g=fopen("rsir.out","w");
    
    fscanf(f,"%d%d%d%d%d%d%d%d%lld",&aux[0][0],&aux[0][1],&a,&b,&x,&y,&z,&M,&n);
  
}

void preparare(void){

    int i;
    for(i=0;i<=M-1;i++){

        A[i]=((long long)a*i*i+(long long)x*i)%M;
        B[i]=((long long)b*i*i+(long long)y*i)%M;
    }
}
void sonra(int &v1, int &v2){

    int v3= (A[v1]+B[v2]+z)%M;
    v1=v2; v2=v3;
}

void find(void){

    int a1=aux[0][0],a2=aux[0][1],b1=aux[0][0],b2=aux[0][1];  long long tt;
    perioada=1;
    sonra(a1,a2); sonra(b1,b2); sonra(b1,b2);
    
    while( a1 != b1 || a2 != b2){
        
        ++perioada; 

        sonra(a1,a2), sonra(b1,b2); sonra(b1,b2);
    
        if (perioada%500 == 0) {tt=(2*perioada)/1000; aux[tt][0]=b1; aux[tt][1]=b2; }
    }

    a1=aux[0][0]; a2=aux[0][1];

    while( a1 != b1 || a2 != b2) {

        coada++;

        sonra(a1,a2); sonra(b1,b2);

    }

}

int gaseste (long long poz){

    int tt;
    tt=poz/1000;
    
    int i; int a1=aux[tt][0], a2=aux[tt][1];

    for(i=1; i <= poz - tt *1000 ; i++) sonra(a1,a2);

    return a1;

}

int truegaseste (long long poz){

    if (poz <= coada) return gaseste(poz);
    else return gaseste(coada+ (poz-coada)%perioada);
}





int main(void){
    read();
    
    preparare();
    find();

    fprintf(g,"%d",truegaseste(n));
    
    return 0;
}