Pagini recente » Cod sursa (job #578646) | Cod sursa (job #270821) | Cod sursa (job #1921154) | Rating Borsan Ciprian (BorsanCipri) | Cod sursa (job #1873057)
#include<fstream>
#include<vector>
#include<cstdio>
#define f first
#define s second
using namespace std;
int n, m, i, j, modx, mody, ox, oy, nx, ny, dist, x, y;
int viz[1005][1005], ff[1005][1005], sol[666800], num[1005][1005], numx[1005], numy[1005];
vector< pair<int, int> > v[1005][1005];
FILE * fin = fopen("robotei.in", "r");
FILE * fout = fopen("robotei.out", "w");
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++){
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(){
fscanf(fin, "%d%d%d%d%d%d%d%d", &n, &m, &x, &y, &modx, &mody, &ox, &oy);
if(x >= modx || y >= mody){
fprintf(fout, "0 %d\n1 1\n", n * n - 1);
return 0;
}
nx = x;
ny = y;
while(viz[nx][ny] == 0){
dist++;
viz[nx][ny] = dist;
nx = (nx * nx + ox) % modx;
ny = (ny * ny + oy) % mody;
}
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 = (i * i + ox) % modx;
ny = (j * j + oy) % mody;
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){
fprintf(fout, "%d %d\n", i, sol[i]);
}
}
return 0;
}