AtCoder Beginner Contest 371 G. Lexicographically Smallest Permutation(数论 枚举 扩展CRT思想)

置换环旋转次数问题的题解思路

题目

deb8633f1a9444e395c0ffc01e16f3cb.png

思路来源

rui_er代码

题解

不难发现,i->pi形成一个置换环,每个置换环有一个长度,

需要确定一个旋转次数x,使得x%cyc[1]=mn[1],x%cyc[2]=mn[2],等等

其中cyc[1]是从前到后遇到的第一个环的环长,

mn[1]为了将第一个环这个环的最小值旋转到首位时的旋转次数

 

然后再遇到第二个环的时候,需要在满足第一个取模条件成立的约束条件下,

找到符合约束条件的位置的最小值mn[2],再令x%cyc[2]=mn[2],并旋转

重复这个操作直到最后一个环

 

注意到环长最大1e5,几个数乘起来爆了long long,所以暴力excrt解是否存在合法x显然不可行

因为cyc[1]+cyc[2]+...=n,总环长是n,所以当前环长是可枚举的

 

一个直观地观察是,

如果前面已经遇到了一个x%6=1,那么再遇到长为6的环的时候,显然只能选x%6=1

 

事实上,约束是按质因子限制的

可以枚举cyc[i]的每个质因子p,把当前mn[i]%p的值记录下来,记为remain[p]

后面的环长cyc[i+1]对应枚举mn[i+1]的时候,如果再遇到remain[p]的话,不能冲突,

冲突的话,说明这个旋转次数,对应把位置旋到第一位当最小值时,不合法

 

遍历环长个位置,找到每个环的合法位置中最小的,然后进行旋转操作即可

 

根据学弟的问题补充一下说明

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值