题目

思路来源
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]的话,不能冲突,
冲突的话,说明这个旋转次数,对应把位置旋到第一位当最小值时,不合法
遍历环长个位置,找到每个环的合法位置中最小的,然后进行旋转操作即可
根据学弟的问题补充一下说明
置换环旋转次数问题的题解思路

最低0.47元/天 解锁文章
559

被折叠的 条评论
为什么被折叠?



