#include <stdio.h>
#include <string.h>
#define NMAX 1001
#define MMAX 666734
FILE *f = fopen("robotei.in","rt"), *g = fopen("robotei.out","wt");
long int offsetx,offsety,newx,newy,modx,mody,n,hash[NMAX][NMAX],nr[NMAX][NMAX];
long int x,y,C[MMAX],len,m,i,j;
struct lista{long int x,y;
lista *urm;} *vf[NMAX][NMAX];
void ciclu()
{
long int X,Y;
hash[x][y]=1;
X= (x*x + offsetx)% modx;
Y= (y*y + offsety)% mody;
len=1;
while (!hash[X][Y])
{
hash[X][Y]=1;
X = (X*X + offsetx)% modx;
Y = (Y*Y + offsety)% mody;
len++;
}
if ((x!=X)||(Y!=y)) len=MMAX;
}
void citire()
{
fscanf(f,"%ld %ld",&n,&m);
fscanf(f,"%ld %ld",&x,&y);
fscanf(f,"%ld %ld %ld %ld",&modx,&mody,&offsetx,&offsety);
for (i=0;i<n;i++)
for (j=0;j<n;j++)
nr[i % modx][j % mody]++;
}
void compute(long int i, long int j)
{
long int k,X,Y,l;
k=0;
X=i;Y=j;
memset(hash,0,sizeof(hash));
while ((X!=x||Y!=y)&&k<=m&&(!hash[X][Y]))
{
k++;
hash[X][Y]=1;
X = (X*X + offsetx)% modx;
Y = (Y*Y + offsety)% mody;
}
if (hash[X][Y]) return;
l=m-k;
k=l/len+1;
C[k]+=nr[i][j];
//if (i==x&&j==y) {C[k+1]++;C[k]--;}
}
void DF(long int x,long int y, long int depth)
{
lista *p;
hash[x][y]=depth;
p=vf[x][y];
while (p)
{
if (!hash[p->x][p->y]) DF(p->x,p->y,depth+1);
p=p->urm;
}
}
void solve()
{
long int X,Y,l,k;
ciclu();
lista *p;
for (i=0;i<modx;i++)
for (j=0;j<mody;j++)
{
X = (i*i + offsetx)% modx;
Y = (j*j + offsety)% mody;
p=new lista;
p->x=i;
p->y=j;
p->urm=vf[X][Y];
vf[X][Y]=p;
}
memset(hash,0,sizeof(hash));
DF(x,y,1);
for (i=0;i<modx;i++)
for (j=0;j<mody;j++)
{
k=hash[i][j];
if (k)
{
k--;
l=m-k;
k=l/len+1;
if (i==x&&j==y)
{C[k-1]+=nr[i][j]-1;
C[k]+=1;
}
else C[k]+=nr[i][j];
}
else C[0]++;
}
for (i=0;i<=m;i++)
if (C[i]) fprintf(g,"%ld %ld\n",i,C[i]);
}
int main()
{
citire();
solve();
fclose(f);
fclose(g);
return 0;
}