倒序处理,并查集维护连续性。
#include<cstdio>
#include<iostream>
using namespace std;
const int N=10000005;
int n,m,p,q;
int color[N],f[N];
int find(int x){
if(x==f[x]) return x;
return f[x]=find(f[x]);
}
int main(){
scanf("%d%d%d%d",&n,&m,&p,&q);
for(int i=1;i<=n;i++) f[i]=i;
for(int i=m;i>=1;i--){
int l=(i*p+q)%n+1,r=(i*q+p)%n+1;
if(l>r) swap(l,r);
for(int j=r;j>=l;){
int xx=find(j);
if(xx==j){
color[j]=i;
f[j]=find(xx-1);
}
j=f[j];
}
}
for(int i=1;i<=n;i++) printf("%d
",color[i]);
return 0;
}