Pagini recente » Cod sursa (job #2904086) | Cod sursa (job #115573) | Cod sursa (job #1380319) | Cod sursa (job #142144) | Cod sursa (job #55671)
Cod sursa(job #55671)
#include <stdio.h>
#define dimmax 1000
#define Mmax 666733
int N,M,X,Y,modX,modY,offsetX,offsetY,L,dist[dimmax][dimmax],i,j,nr[Mmax];
char w[dimmax][dimmax];
void lungime(int x,int y)
{
int nrp;
x=(x*x+offsetX)%modX;
y=(y*y+offsetY)%modY;
nrp=1;
while (((x!=X)||(y!=Y))&&(nrp<=modX*modY))
{
x=(x*x+offsetX)%modX;
y=(y*y+offsetX)%modY;
++nrp;
}
if ((x!=X)||(y!=Y)) L=0;
else L=nrp;
}
int dfs(int i,int j)
{
i=(i*i+offsetX)%modX;
j=(j*j+offsetY)%modY;
if ((w[i][j]==1)&&(dist[i][j]==0)) return -(N*N);
if ((i==X)&&(j==Y)) return 0;
else
{
w[i][j]=1;
if (dist[i][j]==0) dist[i][j]=dfs(i,j)+1;
}
return dist[i][j];
}
void bfs()
{
int aux;
for (i=0;i<modX;++i)
for (j=0;j<modY;++j)
{
if (dist[i][j]==0)
{
if ((i==X)&&(j==Y)) continue;
w[i][j]=1;
dist[i][j]=dfs(i,j)+1;
}
}
for (i=0;i<modX;++i)
for (j=0;j<modY;++j)
if ((dist[i][j]>=0)&&(dist[i][j]<M))
{
aux=(((N-1-i)/modX)+1)*(((N-1-j)/modY)+1);
if (L!=0) nr[((M-dist[i][j])/L)+1]+=aux;
else nr[1]+=aux;
nr[0]-=aux;
}
}
int main()
{
freopen("robotei.in","r",stdin);
scanf("%d %d %d %d %d %d %d %d",&N,&M,&X,&Y,&modX,&modY,&offsetX,&offsetY);
fclose(stdin);
lungime(X,Y);
freopen("robotei.out","w",stdout);
nr[0]=N*N;
if ((X<modX)&&(Y<modY)) bfs();
else { nr[1]=1;--nr[0]; }
for (X=0;X<=M;++X)
if (nr[X]!=0) printf("%d %d\n",X,nr[X]);
fclose(stdout);
return 0;
}