zoukankan      html  css  js  c++  java
  • HihoCoder 1330 数组重排

    题目链接


    将重排方式看作是m个置换,求每个置换群内元素个数的最小公倍数

    并查集处理出每个置换内的元素


    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    int n,a[150];
    int fa[150],sum[150];
    int find(int x)
    {
        if(x == fa[x]) return x;
        else
        {
            return fa[x] = find(fa[x]);
        }
    }
    int gcd(int a, int b)
    {
        return b == 0 ? a : gcd(b, a%b);
    }
    int main()
    {
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        for(int i = 0; i <= n; i++)
            fa[i] = i, sum[i] = 1;
        for(int i = 1; i <= n; i++)
        {
            int x = find(i), y = find(a[i]);
            if(x != y)
            {
                fa[x] = y;
                sum[y] += sum[x];
            }
        }
        int ans = 0;
        for(int i = 1; i <= n; i++)
        {
            if(fa[i] == i)
            {
                int g = gcd(ans, sum[i]);
                if(ans == 0) ans = g;
                else ans = sum[i]*ans/g;
            }
        }
        printf("%d
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    day 011总结
    day 010 总结
    day 10作业
    day 009总结
    day 008总结
    wireshark 解密tls消息
    js基础 数组slice
    js基础 数组splice
    js基础 Array.from
    js基础 Array.of
  • 原文地址:https://www.cnblogs.com/Alruddy/p/7513009.html
Copyright © 2011-2022 走看看