zoukankan      html  css  js  c++  java
  • HDU5392——最小公倍数——Infoplane in Tina Town

    http://acm.hdu.edu.cn/showproblem.php?pid=5392

    /*
    先把循环长度提取出来,再求这些长度的最小公倍数
    把质因数都分解出来,每个质因数取最大所有数之积就是最小公倍数
    */
    /************************************************
    * Author        :Powatr
    * Created Time  :2015-8-17 11:11:42
    * File Name     :HDU5392.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int MAXN = 3e6 + 10;
    const int INF = 0x3f3f3f3f;
    const long long  MOD = 3221225473;
    int vis[MAXN];
    int a[MAXN];
    int b[MAXN];
    
    int main(){
        int T;
        int n;
        scanf("%d", &T);
        while(T--){
            memset(b, 0, sizeof(b));
            memset(vis, 0, sizeof(vis));
            scanf("%d", &n);
            for(int i = 1; i <= n; i++)
                scanf("%d", &a[i]);
            for(int i = 1; i <= n; i++){
                int k = a[i];
                int len = 1;
                if(vis[k]) continue;
                    while(k!=i){
                        vis[k] = 1;
                        len++;
                        k = a[k];
                    }
                    vis[k] = 1;
               // printf("%d", len);
                for(int j = 2; j*j <= len; j++){
                    if(len % j == 0){
                        int c = 0;
                        while(len % j == 0){
                            len /= j;
                            c++;
                        }
                        b[j] = max(b[j], c);
                    }
                }
                b[len] = max(b[len], 1);
            }
            ll ans = 1;
            for(int i = 2; i <= n; i++){
                for(int j = 0; j < b[i]; j++){
                    ans = ans * i % MOD;
                }
            }
            printf("%I64d
    ", ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    ASP.NET MVC 3: Razor中的@:和语法
    如何设置VS的代码智能提示
    七次
    不知不觉
    一切一切
    什么是喜欢
    Oracle的substr函数简单用法与substring区别
    前端必读:浏览器内部工作原理(转载)
    sublime text 插件安装 Mac版的
    一个随机上翻的小效果
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4736435.html
Copyright © 2011-2022 走看看