Description
Input
Output
输出一个样例的结果。
Sample Input
3
3 1 2 3
3 2 1 3
3 2 3 1
Sample Output
1
2
3
解题思路:
这个题只要清楚置换的具体操作即可(实在不明白,就去看看离散书吧)。
首先对于置换中的任意一个元素,我们通过重复执行给定的置换使其回到自己位置并记每个元素回到自己位置需要的置换次数。然后求这些数字的最小公倍数即可。
注意:该题数据会超出int,需要使用long long或__int64来存储数据。
#include<bits/stdc++.h>
using namespace std;
__int64 gcd(__int64 a,__int64 b)
{
return b==0 ? a : gcd(b,a%b);
}
int main()
{
int k;
cin>>k;
while(k--)
{
int n;
cin>>n;
int x[101];
for(int i = 1 ;i <= n; i++)
scanf("%d",&x[i]);
__int64 cnt = 1;
for(int i = 1 ;i <= n;i++)
{
__int64 temp = 1;
int flag = x[i];
while(flag!=i)
{
temp++;
flag = x[flag];
}//求第i个元素需要置换几次
cnt = cnt * temp /gcd(cnt,temp);
}
cout<<cnt<<endl;
}
return 0;
}