0
点赞
收藏
分享

微信扫一扫

Java习题练习:1241 Permutation

一条咸鱼的干货 2022-04-13 阅读 47
javaeclipse

目录

题目描述

给一个置换P(x⃗ ),Pn(x⃗ )=x⃗ ,求最小的n。比如置换P=(12233441),
P(x1,x2,x3,x4)P2(x1,x2,x3,x4)P3(x1,x2,x3,x4)P4(x1,x2,x3,x4)====(x4,x1,x2,x3)(x3,x4,x1,x2)(x2,x3,x4,x1)(x1,x2,x3,x4)
所以n=4。

输入

第一行是一个整数K(1≤K≤1000),表示样例的个数。
每个样例占一行,第一个整数是n(1≤n≤100),以后的n个整数xi,1≤xi≤n且 xi是唯一的, (1x12x2⋯⋯nxn)表示一个置换。

输出

输出一个样例的结果。

样例输入
3
3 1 2 3
3 2 1 3
3 2 3 1
样例输出
1
2
3

置换的相关知识

链接: 置换(群)&(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);
		}
	}
}

举报

相关推荐

0 条评论