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