Java习题练习:1241 Permutation

题目描述

在这里插入图片描述
在这里插入图片描述

置换的相关知识

链接: 置换(群)&(J Just Shuffle).

题解

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