Cod sursa(job #1873123)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 8 februarie 2017 20:02:15
Problema Robotei Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#include<fstream>
#include<vector>
#define f first
#define s second
using namespace std;
int n, m, i, j, modx, mody, ox, oy, nx, ny, dist, x, y;
int ff[1005][1005], sol[666800], num[1005][1005], numx[1005], numy[1005];
char viz[1005][1005];
int mx[1005], my[1005];
vector< pair<int, int> > v[1005][1005];
ifstream fin("robotei.in");
ofstream fout("robotei.out");
void dfs(int x, int y){
    for(int i = 0; i < v[x][y].size(); i++){
        int nx = v[x][y][i].f;
        int ny = v[x][y][i].s;
        if(ff[nx][ny] == 0){
            ff[nx][ny] = ff[x][y] + 1;
            dfs(nx, ny);
        }
    }
}
void update(){
     int nr;
     for(i = 0; i < modx; i++){
        if(numx[i] == 0){
            continue;
        }
        for(j = 0; j < mody; j++){
            nr = num[i][j];
            if( (viz[i][j] == 0 && ff[i][j] == 0) || ff[i][j] > m){
                sol[0] += nr;
            }
            else{
                if(ff[i][j] > 0){
                    if(dist == -1){
                        sol[1] += nr;
                    }
                    else{
                        sol[ (m - ff[i][j]) / dist + 1] += nr;
                    }
                }
                else{
                    if(dist == -1){
                        sol[0] += nr;
                    }
                    else{
                        sol[ (m - ff[i][j]) / dist + 1] += nr;
                    }
                }
            }
        }
    }
}
int main(){
    fin>> n >> m >> x >> y >> modx >> mody >> ox >> oy;
    if(x >= modx || y >= mody){
        fout<<"0 "<< n * n - 1 <<"\n"<<"1 1\n";
        return 0;
    }
    for(i = 0; i < modx; i++){
        mx[i] = (i * i + ox) % modx;
    }
    for(j = 0; j < mody; j++){
        my[j] = (j * j + oy) % mody;
    }
    nx = x;
    ny = y;
    while(viz[nx][ny] == 0){
        dist++;
        viz[nx][ny] = 1;
        nx = mx[nx];
        ny = my[ny];
    }
    if(nx != x || ny != y){
        dist = -1;
    }
    for(i = 0; i < n; i++){
        nx = (i * i + ox) % modx;
        ny = (i * i + oy) % mody;
        numx[nx]++;
        numy[ny]++;
    }
    for(i = 0; i < modx; i++){
        for(j = 0; j < mody; j++){
            num[i][j] += numx[i] * numy[j];
            nx = mx[i];
            ny = my[j];
            v[nx][ny].push_back( make_pair(i, j));
        }
    }
    ff[x][y] = 1;
    dfs(x, y);
    num[x][y]--;
    update();
    if(dist == -1){
        sol[1]++;
    }
    else{
        sol[m / dist + 1]++;
    }
    for(i = 0; i <= m; i++){
        if(sol[i] != 0){
            fout<< i <<" "<< sol[i] <<"\n";
        }
    }
    return 0;
}