[Poi2003]Shuffle


Byteasar 有一堆n 张牌想洗牌. 牌的位置从1 到 n编号. 一张在位置k的卡(1 <= k <= n) 下一次总是会到ak位置上. 我们定义bk 为Byteasar洗了l次牌后第k张牌的最终位置(初始时在位置k上的牌). 我们想知道初始的a序列。
Input
第一行有两个整数n和 l (1 <= n, l <= 1000000).
接下来n行描述了序列(bk), 1 <= bk <= n.
Output
输出n行每行一个整数描述序列(ak),
你可以假设数据保证肯定保证至少有一组解. 如有多解输出任意一组即可.
Sample Input
5 2
1
2
5
3
4
Sample Output
1
2
4
5
3
or:
2
1
4
5
3

Hint
1 2 3 4 5  1 2 4 5 3
               *                   =1 2 5 3 4
1 2 4 5 3  1 2 5 3 4

想象一个长度为L的循环,如果我们将这个循环求k次方,
我们将会得到Gcd(L,k)个长度为L/Gcd(L,k)的循环
那么现在我们将b分解成循环,
假如现在我们得到了一个长度为L′的循环,
那么由之前的结论可以得到L′=L/Gcd(L,k)
L=L'*Gcd(L,K)
于是对L'对待质因子分解,设某个质因子指数为a,它在K中的指数为b
则其在L中的指数x=a+min(x,b)
将x<b时,x=a+x,这明显是不成立的
于是x>=b,x=a+b
例如L'=20,K=6
L'=2^2 *5,k=2*3
于是L=2^*(1+2) * 5 ^(1+0)=40

对于这个长度为40的置换,只需要将L'所代表的那个置换(EN,分裂出来了两个),交错相连即可!

当L'=30时,算出来L=180,于是只需要将L'所代表的那个置换(EN,分裂出来了180/30=6个)

则形成(a1b1c1d1e1f1a2.....f2a3........f3..........a30........b30)

————————————————
版权声明:本文为CSDN博主「PoPoQQQ」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/popoqqq/article/details/45974413

posted @ 2020-01-01 20:54  我微笑不代表我快乐  阅读(119)  评论(0编辑  收藏  举报