Cod sursa(job #1873075)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 8 februarie 2017 19:33:03
Problema Robotei Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.94 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[1001005], my[1001005];
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 t){
     int nr;
     for(i = 0; i < modx; i++){
        if(t == 1 && numx[i] == 0){
            continue;
        }
        for(j = 0; j < mody; j++){
            if(t == 0){
                nr = 1;
            }
            else{
                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;
    }
    ox %= modx;
    oy %= mody;
    nx = max(modx, mody) * max(modx, mody) + max(ox, oy);
    for(i = 1; i <= nx; i++){
        mx[i] = mx[i - 1] + 1;
        my[i] = my[i - 1] + 1;
        if(mx[i] == modx){
            mx[i] = 0;
        }
        if(my[i] == mody){
            my[i] = 0;
        }
    }
    nx = x;
    ny = y;
    while(viz[nx][ny] == 0){
        dist++;
        viz[nx][ny] = 1;
        nx = mx[nx * nx + ox];
        ny = my[ny * ny + oy];
    }
    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 * i + ox];
            ny = my[j * j + oy];
            num[nx][ny]--;
            v[nx][ny].push_back( make_pair(i, j));
        }
    }
    ff[x][y] = 1;
    dfs(x, y);
    m++;
    update(0);
    m--;
    update(1);
    for(i = 0; i <= m; i++){
        if(sol[i] != 0){
            fout<< i <<" "<< sol[i] <<"\n";
        }
    }
    return 0;
}