• hihocoder 1330


    题目链接:https://hihocoder.com/problemset/problem/1330

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Hi想知道,如果他每次都按照一种固定的顺序重排数组,那么最少经过几次重排之后数组会恢复初始的顺序?

    具体来讲,给定一个1 - N 的排列 P,小Hi每次重排都是把第 i 个元素放到第 Pi个位置上。例如对于 P = (2, 3, 1),假设初始数组是(1, 2, 3),重排一次之后变为(3, 1, 2),重排两次之后变为(2, 3, 1),重排三次之后变回(1, 2, 3)。

    被排数组中的元素可以认为是两两不同的。

    输入

    第一行一个整数 N ,代表数组的长度。 (1 ≤ N ≤ 100)

    第二行N个整数,代表1 - N 的一个排列 P 。

    输出

    输出最少重排的次数。

    (PS.从实际提交的AC代码来看,似乎重排次数至少为1,即必须进行重排操作)

    样例输入
    3
    2 3 1
    样例输出
    3

    题解:

    不难看出,任意一个数,它经过有限步数就可以回到原来位置;

    那么,我们根据P=(2,3,1),那么初始数列第一位a[1],第一步操作后它会变到第二位,第二步操作后它会变到第三位,第三步操作后它又会变回第一位,即回到原位;

    如果忽视实际意义上的操作,简单的从数字变换来讲,即1→2→3→1,三个箭头,代表操作了三步;

    那么更加广泛的,例如P=(5,2,1,4,3,6),对于每一位有:

      1→5→3→1(3步);

      2→2(1步);

      3→1→5→3(3步);

      ……

      5→3→1→5(3步);

      6→6(1步);

    然后当时我做到这一步就猜想是不是枚举每一位要最少重排多少步能回到原位,取最大值即可;

    不过显然有反例,例如P=(3,2,1,5,6,4),这样即:

      1→3→1(2步);

      2→2(1步);

      3→1→3(2步);

      4→5→6→4(3步);

      5→6→4→5(3步);

      6→4→5→6(3步);

    这样到底要重排多少次才能让整个数列回到原来顺序呢,显然是lcm(2,1,2,3,3,3)=6,即每一位回到原点的最少步数的最小公倍数;

    AC代码:

     1 #include<cstdio>
     2 int n,p[105],ans=1;
     3 int gcd(int m,int n){return n?gcd(n,m%n):m;}
     4 int lcm(int m,int n){return m/gcd(m,n)*n;}
     5 int main()
     6 {
     7     scanf("%d",&n);
     8     for(int i=1;i<=n;i++) scanf("%d",&p[i]);
     9     for(int i=1;i<=n;i++)
    10     {
    11         int now=p[i],cnt=1;
    12         while(1)
    13         {
    14             if(now==i) break;
    15             else
    16             {
    17                 now=p[now];
    18                 cnt++;
    19             }
    20         }
    21         ans=lcm(ans,cnt);
    22     }
    23     printf("%d
    ",ans);
    24 }

    PS.虽然用了GCD,但我都不好意思放数论分类里,放其他分类里吧……

  • 相关阅读:
    Python字典的初识、增删改查及嵌套
    Python列表的增删改查
    模块基础
    开放封闭原则和装饰器
    多层装饰器叠加装饰
    Python字符串的常用方法
    可迭代对象、迭代器对象和生成器对象
    日程安排组件dhtmlxScheduler汉化(转)
    dedecms在软件列表页调出下载链接
    [下载]《SAP R/3 IDES 4.71 中文版》
  • 原文地址:https://www.cnblogs.com/dilthey/p/7512245.html
Copyright © 2020-2023  润新知