链接:https://ac.nowcoder.com/acm/contest/5670/E
来源:牛客网

题意:

给你一个你,和长度为n的数列,问你最多能开心几天

solution:

置换,寻找数列循环节,求出每个循环节的长度,然后对于两两的循环节求lcm,就可以求出最多能开心几天了
主要是大数处理用c++写比较麻烦,可以用python或者Java

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        BigInteger  ans=BigInteger.valueOf(1);
        int[] p=new int[100010];
        int[] vis=new int[100010];
        BigInteger cnt;
        int[] G=new int[100010];
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int xx=n;
        BigInteger mod=BigInteger.valueOf(1);
        BigInteger a=BigInteger.valueOf(10);
        while(xx>0) {
            if(xx%2==1)mod=mod.multiply(a);
            a=a.multiply(a);
            xx/=2;
        }
        for(int i=1;i<=n;i++){
            p[i]=in.nextInt();
            G[p[i]]=i;
            vis[i]=0;
        }
        lcm qaq=new lcm();
        BigInteger b=BigInteger.valueOf(1);
        for(int i=1;i<=n;i++) {
            if(vis[i]==1)continue;
            cnt=BigInteger.valueOf(0);
            int x=i;
            while(vis[x]==0) {
                cnt=cnt.add(b);
                vis[x]=1;
                x=G[x];
            }
            BigInteger d=qaq.gcd(ans,cnt);
            ans=ans.multiply(cnt);
            ans=ans.divide(d);
            ans=ans.mod(mod);
        }
        System.out.println(ans);
    }
}
class lcm{
    BigInteger c=BigInteger.valueOf(0);
    BigInteger gcd(BigInteger a,BigInteger b) {
        return b.compareTo(c)>0?gcd(b,a.mod(b)):a;
    }
}