Java演習:1241順列

トピックの説明

ここに画像の説明を挿入
ここに画像の説明を挿入

交換に関する知識

リンク:順列(グループ)&(Jジャストシャッフル)

答え

import java.util.Scanner;

public class Main {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		Scanner in=new Scanner (System.in);//输入的前提语句
		int k=in.nextInt();//输入k
		int [] x=new int[101];//定义数组
		for(int i=0;i<k;i++) {
    
    //样例循环
			int n=in.nextInt();//n个数字
			for(int j=1;j<=n;j++) {
    
    //输入数组
				x[j]=in.nextInt();
			}
			long res=1;//因为存贮最小公倍数的取值,所以初始值为1
			for(int z=1;z<=n;z++) {
    
    
				int p=x[z];
				long tmp=1;//p已经变化了一次了,所以初始值为1
				while(p!=z) {
    
    
					p=x[p];
					tmp++;
				}
				res=res*tmp/gcd(res,tmp);//求得最大公约数,即可求得最大公倍数
			}
			System.out.println(res);//输出答案
			
		}
	}
	//gcd求最大公约数,辗转相除法
	static long gcd(long a,long b) {
    
    
		if(b==0) {
    
    //请不要照抄我的代码
			return a;//稍微改改变量名之类的
		}
		else {
    
    
			return gcd(b,a%b);
		}
	}
}

おすすめ

転載: blog.csdn.net/m0_51456787/article/details/123871343