Permutation | ||
[ Submit Code ] [ Top 20 Runs ] | ||
Acceteped : 27 | Submit : 105 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description | ||
置换题目描述给一个置换 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)amp;=amp;=amp;=amp;=amp;(x4,x1,x2,x3)amp;(x3,x4,x1,x2)amp;(x2,x3,x4,x1)amp;(x1,x2,x3,x4)
所以
n=4
。
输入第一行是一个整数
K(1≤K≤1000)
,表示样例的个数。 输出输出一个样例的结果。 样例输入3 3 1 2 3 3 2 1 3 3 2 3 1 样例输出1 2 3 | ||
Sample Input | ||
Sample Output | ||
Source | ||
[ Submit Code ] [ Top 20 Runs ] |
思路:群的置换原理。我们只要将每一个数归位,记录用了多少次。然后求得各个次数的最小公倍数即可。
AC代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
int per[maxn];
int n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T--){
cin >> n;
for (int i=1; i<=n; ++i)
cin >> per[i];
int ans = 1;
for (int i=1; i<=n; ++i){
int pos=i, cnt=0;
do{
pos = per[pos];
++cnt;
} while (pos != i);
ans = ans/__gcd(ans, cnt)*cnt;
}
cout << ans << endl;
}
return 0;
}