Cod sursa(job #1652758)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 15 martie 2016 13:05:15
Problema Robotei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<cstdio>
#include<vector>
#define INF 2000000000
int n,m,qx,qy,ox,oy,modx,mody,a,b,i,j,cl,vmax,x[1010][1010],vx[1010],vy[1010],v[1010][1010],sol[700000],y[1010][1010];
FILE *f,*g;
int opx(int a){
    return ( a * a + ox ) % modx;
}
int opy(int a){
    return ( a * a + oy ) % mody;
}
void calc(int a,int b){
    x[a][b] = - 1;
    int aa = opx(a);
    int bb = opy(b);
    if( x[aa][bb] == INF )
        calc(aa,bb);
    if( x[aa][bb] != -1 )
        x[a][b] = x[aa][bb] + 1;
}
int maxim(int a,int b){
    if(a>b)
        return a;
    return b;
}
int main(){
    f=fopen("robotei.in","r");
    g=fopen("robotei.out","w");
    fscanf(f,"%d%d%d%d%d%d%d%d",&n,&m,&qx,&qy,&modx,&mody,&ox,&oy);
    for(i=0;i<n;i++){
        a = opx(i);
        vx[a] ++;
        a = opy(i);
        vy[a] ++;
    }
    for(i=0;i<modx;i++){
        for(j=0;j<mody;j++){
            v[i][j] = vx[i] * vy[j];
            x[i][j] = INF;
        }
    }
    x[qx][qy] = 0;
    for(i=0;i<modx;i++){
        for(j=0;j<mody;j++){
            if( x[i][j] == INF )
                calc(i,j);
        }
    }
    a = opx(qx);
    b = opy(qy);
    cl = x[a][b] + 1;
    for(i=0;i<modx;i++){
        for(j=0;j<mody;j++){
            if( x[i][j] != -1 && x[i][j] < m ){
                y[i][j] = 1 + ( m - 1 - x[i][j] ) / cl ;
                sol[ y[i][j] ] += v[i][j];
            }
        }
    }
    sol[ y[a][b] ]--;
    sol[ y[a][b]+1 ]++;
    for(i=0;i<=m;i++){
        if( sol[i] != 0 ){
            fprintf(g,"%d %d\n",i,sol[i]);
        }
    }

    fclose(f);
    fclose(g);
    return 0;
}