Cod sursa(job #1153665)

Utilizator omerOmer Cerrahoglu omer Data 25 martie 2014 17:19:33
Problema Rsir Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<stdio.h>
using namespace std;
FILE *f,*g;

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

int coada, perioada;

int aux[10000][2];

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 sonra(int &v1, int &v2){

    int v3= ((int)a*v1*v1+(int)b*v2*v2+(int)x*v1+(int)y*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];  int 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%5000 == 0) {tt=perioada/10000; 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 (int poz){

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

    for(i=1; i <= poz - tt *10000 ; 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();

    find();

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