Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 最小迭代次数_C++_Arrays_Algorithm - Fatal编程技术网

C++ 最小迭代次数

C++ 最小迭代次数,c++,arrays,algorithm,C++,Arrays,Algorithm,我们得到一个数字范围为1到n(无重复)的数组,其中n=数组的大小。 允许我们执行以下操作: arr[i]=arr[arr[i]-1],0首先,请注意,包含1,2,…,n且没有重复项的长度为n的数组是一个数组 接下来,观察arr[i]:=arr[arr[i]-1]正在对置换进行平方处理。 也就是说,将置换看作是Syn的元素,其中乘法是排列的组合。 那么上面的操作是arr:=arr*arr 因此,就排列及其组成而言,问题如下: 您将获得一个排列p(=arr)。 考虑置换p,p^ 2,p^ 4,p^

我们得到一个数字范围为1到n(无重复)的数组,其中n=数组的大小。 允许我们执行以下操作:

arr[i]=arr[arr[i]-1],0首先,请注意,包含1,2,…,n且没有重复项的长度为n的数组是一个数组

接下来,观察
arr[i]:=arr[arr[i]-1]
正在对置换进行平方处理。 也就是说,将置换看作是Syn的元素,其中乘法是排列的组合。 那么上面的操作是
arr:=arr*arr

因此,就排列及其组成而言,问题如下:

您将获得一个排列p(=arr)。
考虑置换p,p^ 2,p^ 4,p^ 8,p^ 16,…
其中不同元素的数量是多少


现在,要解决它,考虑排列的问题。 每个置换都是不相交循环的产物。 例如,

6143552
是以下循环的产物:
(162)(34)(5)
。 换言之,此排列的每个应用程序:

  • 沿循环移动位置1、6、2处的元素
  • 沿循环移动位置4、3处的元素
  • 将元素保留在位置5处

这样,当我们考虑p^ k(取一个恒等置换,并将置换p应用到k次)时,我们实际上处理了三个独立的动作:

  • 沿循环移动位置1、6、2处的元件,k次
  • 沿循环移动位置4、3处的元件,k次
  • 将元件保持在位置5,k次
现在,考虑到,在对长度为d的循环进行d次应用之后,它只会将所有相应的元素返回到它们的初始位置。 因此,我们可以将p^k表示为:

  • 沿循环(k mod 3)次移动位置1、6、2处的元件
  • 沿循环(k mod 2)次移动位置4、3处的元件
  • 将元件保持在位置5处

现在我们可以证明(使用或仅仅使用群论的一般知识)排列p,p^2,p^3,p^4,p^5。。。在p^m之前都是不同的,其中m是所有循环长度的最大值。 在我们的示例中,p=
6143552
,p、p^2、p^3、p^4、p^5和p^6都是不同的。 但p^6是身份置换:沿着长度为2或3的循环移动六次,结果是项目位于其初始位置。 所以p^7和p^1一样,p^8和p^2一样,依此类推


然而,我们的问题更难:我们想知道的不是p,p^2,p^3,p^4,p^5,…,而是p,p^2,p^4,p^8,p^16,…,不同排列的数量:p的二次幂。 要做到这一点,考虑我们排列中的所有循环长度Cy1,Cy2,…,Cyr。 对于每个c_i,查找2^k mod c_i的前周期和周期:

  • 例如,c_1=3和2^k mod 3看起来是
    1,2,1,2,…
    ,这是
    (1,2)
    ,前面是句点0和句点2

  • 另一个例子是,c_2=2,2^k mod 2看起来是
    1,0,0,…
    ,这是
    1,(0)
    ,前面是句点1和句点1

在这个问题中,这一部分可以简单地完成,只需在一些数组中标记访问的数字mod c_i

根据中国剩余定理,在考虑了所有前周期后,整个循环系统的周期将是所有单个周期的最小公倍数

剩下的是考虑前期。 不管怎样,这些都可以用您的原始解决方案来处理,因为这里的预周期长度最多为log_2 n。
答案是所有单个周期中最不常见的倍数,按上述方法计算,再加上最长的预周期长度。

您的问题是什么?你需要什么帮助?是的,正如@StPiere所说,我需要一个提示或算法。我无法想出任何最佳的解决方案。我只能给蛮力编代码,但它给了我TLE@crazyCoder您是如何将结果存储在一个集合中的?作为字符串?也许Trie数据结构更适合存储已经遇到的排列
Constraints :  
a) Array has no duplicates
b) 1 <= arr[i] <= n , 0 <= i < n  
c) 1 <= n <= 10^6  
n = 5  
arr[] = {5, 4, 2, 1, 3}  

  
After 1st iteration array becomes : {3, 1, 4, 5, 2}  
After 2nd iteration array becomes : {4, 3, 5, 2, 1}  
After 3rd iteration array becomes : {2, 5, 1, 3, 4}  
After 4th iteration array becomes : {5, 4, 2, 1, 3}    
In the 4th iteration, the sequence obtained is already seen before  
So the expected output is 4.