链接: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;
}
}



京公网安备 11010502036488号