Description
小t非常喜爱画画,但是他还是一个初学者。他最近费尽千辛万苦才拜到已仙逝的达芬奇为师(神仙?妖怪?谢谢)。达芬奇果然是画鸡蛋长大的,让小t一入门就拿着一张白纸条疯狂地涂色。假设纸条被划分成了
n
个区域,用
现在由于达芬奇下达的指令过多,小t一时应付不过来。达芬奇只让他回答每一个区域最后的颜色。趁达芬奇还在“五谷轮回之所”忙碌时,小t偷偷的请让你这个计算机高手帮他算出最后的颜色状态,并告诉他。时间紧迫,要快哟!(达芬奇的指令次数多到恶心)
Input
为四个整数
Output
n
行,第
Sample Input
1000 999 341 547
Sample Output
输出太长了所以不贴了..
HINT
1≤n≤1000000 , 1≤m≤10000000 , 1≤m∗p+q,m∗q+p≤231−1 ;
友情提示:
加入编译开关{$M 100000000,0,100000000}
,可防栈溢出
solution
最后涂的颜色肯定会覆盖之前涂的颜色,所以直接倒着涂还没有被涂色的部分就可以啦
快速找没有被涂色的部分可以用并查集,这样就可以做到 O(N+M)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
template<typename T>
void input(T &x) {
x=0; T a=1;
register char c=getchar();
for(;c<'0'||c>'9';c=getchar())
if(c=='-') a=-1;
for(;c>='0'&&c<='9';c=getchar())
x=x*10+c-'0';
x*=a;
return;
}
#define MAXN 1000010
#define MAXM 100010
int col[MAXN];
int father[MAXN];
int Find(int x) {
return father[x]==x?x:father[x]=Find(father[x]);
}
int main() {
int n,m,p,q;
input(n),input(m),input(p),input(q);
for(int i=1;i<=n+1;i++)
father[i]=i;
for(int i=m;i;i--) {
int l=(i*p+q)%n+1;
int r=(i*q+p)%n+1;
if(l>r) swap(l,r);
for(int j=Find(l);j<=r;j=Find(j))
col[j]=i,father[j]=j+1;
}
for(int i=1;i<=n;i++)
printf("%d\n",col[i]);
return 0;
}