Pagini recente » Cod sursa (job #1857840) | Cod sursa (job #2015432) | Cod sursa (job #1621706) | Cod sursa (job #69061) | Cod sursa (job #1873123)
#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;
}