Cod sursa(job #893448)

Utilizator HulkIncredibilul Hulk Hulk Data 26 februarie 2013 15:46:40
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>
#include<set>
using namespace std;
 
#define pi pair<int,int>
#define x first
#define y second
#define mp make_pair
#define ll long long
 
ll n;
int t0,t1,a,b,x,y,z,MOD,ind1;
int prep[2][7005],val;
pi val1,val2;
 
inline pi Next(pi per)
{
    val = prep[0][per.x] + prep[1][per.y];
    if(val >= MOD)
        val -= MOD;
    return mp(per.y, val);
}
 
int main ()
{
    int i;
     
    freopen("rsir.in","r",stdin);
    freopen("rsir.out","w",stdout);
     
    scanf("%d%d%d%d%d%d%d%d%lld",&t0,&t1,&a,&b,&x,&y,&z,&MOD,&n);
    if(!n)
    {
        printf("%d\n",t0);
        return 0;
    }
    if(n == 1)
    {
        printf("%d\n",t1);
        return 0;
    }
    for(i = 0; i < MOD; i++)
    {
        prep[0][i] = (((i * i) % MOD) * a + i * x + z) % MOD; 
        prep[1][i] = (((i * i) % MOD) * b + i * y) % MOD; 
    }   
     
    ind1 = 1;
    val1 = mp(t0 % MOD,t1 % MOD);   
    val2 = mp(t0 % MOD,t1 % MOD);
     
    if(n <= 1000 * 1000)
    {
        for(i = 2; i <= n; i++)
            val1 = Next(val1);
        printf("%d\n",val1.y);  
        return 0;
    }
    for(; ;)
    {
        ind1++;
        val1 = Next(val1);
        val2 = Next(Next(val2));
        if(val1 == val2)
            break;
    }       
    i = ind1 - 1;
    n = (n - ind1) % i;
    for(val2 = val1; n; n--, val2 = Next(val2));
     
    printf("%d\n",val2.y);
     
    return 0;
}