直接照着题目构造Xi,i∈[1,nm]
12 | 9 | 1 | 7 |
5 | 11 | 6 | 2 |
4 | 10 | 3 | 8 |
我们把矩阵数组记为A
路径集合
首先:
那么A2..3,1..2(={4,5,11,10})和A1..0,4..4(O̸)不能经过
然后A2,4=2也必须经过。
A3..3,1..3(={4,10,3})和A1..1,5..4(O̸)不能经过
现在为止:
B={1,2} C={3,4,5,10,11}
显然,6也必须经过(
那么A3..3,1..2(={4,10})和A1..1,4..4(={7})不能经过
B={1,2,6} C={3,4,5,7,10,11}
后面同理,最后得:
B={1,2,6,8,9,12} C={3,4,5,7,10,11}
所以不就是贪心???
ll x,a,b,c,d;
#define __ 5000
#define _ __*__
int n,m,g[_+10],k[_+10],l[__+10],r[__+10];
void swap(int x,int y)
{
int ___=g[x];
g[x]=g[y];
g[y]=___;
}
int main(){
x=read();
a=read();
b=read();
c=read();
d=read();
n=read();
m=read();
fr(i,1,n*m)
g[i]=i;
fr(i,1,n*m)
{
x=(a*x*x+b*x+c)%d;
int k=x%i+1;
swap(i,k);
}
fr(i,1,read())
{
int u=read(),v=read();
swap(u,v);
}
fr(i,1,n*m)
k[g[i]]=i-1;
fr(i,1,n)
{
l[i]=1;
r[i]=m;
}
fr(i,1,n*m)
if(k[i]%m+1>=l[k[i]/m+1]&&k[i]%m+1<=r[k[i]/m+1])
{
printf("%d ",i);
fr(j,1,k[i]/m)
r[j]=min(r[j],k[i]%m+1);
fr(j,k[i]/m+2,n)
l[j]=max(l[j],k[i]%m+1);
}
rt 0;
}