Pagini recente » Cod sursa (job #2912944) | Adunarea jocurilor | Cod sursa (job #3229096) | Diferente pentru preoni-2007/runda-2/solutii intre reviziile 40 si 32 | Cod sursa (job #2045044)
#include <iostream>
#include <cstring>
using namespace std;
long long N,M,X,Y;
long long MODX,MODY;
long long OFFX,OFFY;
long long W[1001][1001];
long long dist[1001][1001];
long long len;
long long rez[666734];
bool viz[1001][1001];
bool ok[1001][1001];
long long grX[1000005];
long long grY[1000005];
pair<long long,long long> adv(long long x,long long y)
{
return {(1LL*x*x+OFFX)%MODX,(1LL*y*y+OFFY)%MODY};
}
void dfs(long long x,long long y)
{
viz[x][y]=1;
pair<long long,long long> tmp=adv(x,y);
if(!viz[tmp.first][tmp.second])dfs(tmp.first,tmp.second);
ok[x][y]|=ok[tmp.first][tmp.second];
if(dist[tmp.first][tmp.second]==0&&X!=tmp.first&&Y!=tmp.second)dist[x][y]=0;
else dist[x][y]=1+dist[tmp.first][tmp.second];
}
long long cate(long long dist,long long len,long long M)
{
M-=dist;
if(M<0)return 0;
return 1+M/len;
}
int main()
{
cin>>N>>M>>X>>Y>>MODX>>MODY>>OFFX>>OFFY;
M--;
for(long long i=0;i<N;i++)grX[(1LL*i*i+OFFX)%MODX]++;
for(long long i=0;i<N;i++)grY[(1LL*i*i+OFFY)%MODY]++;
for(long long i=0;i<MODX;i++)
{
for(long long j=0;j<MODY;j++)
{
W[i][j]=grX[i]*grY[j];
///cerr<<W[i][j]<<" ";
}
///cerr<<"\n";
}
if(X>=MODX||Y>=MODY)
{
cout<<"0 "<<N*N-1<<"\n1 1";
return 0;
}
long long x=X,y=Y;
do
{
viz[x][y]=1;
pair<long long,long long> tmp=adv(x,y);
x=tmp.first;
y=tmp.second;
len++;
}
while(!viz[x][y]);
if(x!=X||y!=Y)
{
rez[1]++;
rez[0]--;
ok[x][y]=1;
for(long long i=0;i<MODX;i++)
{
for(long long j=0;j<MODY;j++)
{
if(!viz[i][j])dfs(i,j);
}
}
for(long long i=0;i<MODX;i++)
{
for(long long j=0;j<MODY;j++)
{
if(ok[i][j]&&dist[i][j]<=M&&(dist[i][j]!=0||(X==i&&Y==j)))rez[1]+=W[i][j];
else rez[0]+=W[i][j];
}
}
for(long long i=0;i<=666732;i++)if(rez[i])cout<<i<<" "<<rez[i]<<"\n";
}
else
{
memset(viz,0,sizeof(viz));
dfs(X,Y);
dist[X][Y]=0;
for(long long i=0;i<MODX;i++)
{
for(long long j=0;j<MODY;j++)
{
if(!viz[i][j])dfs(i,j);
}
}
for(long long i=0;i<MODX;i++)
{
for(long long j=0;j<MODY;j++)
{
if(dist[i][j]!=0||(X==i&&Y==j))rez[cate(dist[i][j],len,M)]+=W[i][j];
}
}
rez[cate(0,len,M+1)]++;
rez[cate(0,len,M)]--;
for(long long i=0;i<=666732;i++)if(rez[i])cout<<i<<" "<<rez[i]<<"\n";
}
return 0;
}