Pagini recente » Cod sursa (job #3236223) | Cod sursa (job #1539429) | Cod sursa (job #3236181) | Cod sursa (job #1773506) | Cod sursa (job #1153727)
#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%50000 == 0) {tt=(2*perioada)/100000; 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/100000;
int i; int a1=aux[tt][0], a2=aux[tt][1];
for(i=1; i <= poz - tt *100000 ; 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;
}