Pagini recente » Cod sursa (job #236257) | Cod sursa (job #1098058) | Cod sursa (job #3171278) | Cod sursa (job #2592628) | Cod sursa (job #55703)
Cod sursa(job #55703)
#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 ((i==X)&&(j==Y))
{
if (L!=0)
{
nr[(M/L)+1]+=1;
if (M/L>0) nr[(M/L)]+=aux-1;
else aux=1;
}
else nr[1]+=aux; //??
nr[0]-=aux;
continue;
}
//
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;
}