每个学年的开始,初一新生都要进行传统的军训。今年有一个军训教官十分奇怪,他为了测试学员们的反应能力,每次吹哨后学员们都会变换位置。每次左数第 i 位学员都会站到第 ai 个位置,经过若干次之后,队伍又会回到原来的样子。你的任务是计算 n 个人的队伍, 教官至少吹多少次哨之后,队伍能恢复到原来样子。
【输入文件】
第一行包含一个整数 N(0<N≤10,000),表示队伍的人数。
接下来的 N 行,每行一个整数 ai 表示左起第 i 个人接下来出现在左起第 ai 个位置上; 数据保证 ai 各不相同。1≤ai≤n
【输出文件】
仅包含一行,一个正整数 M,表示军官最少的吹哨次数。(答案均在 64 位整数范围之内)
【输入样例】
5
2
3
4
5
1
【输出样例】
5
这是我的代码,请问有什么问题啊?
#include <bits/stdc++.h>
using namespace std;
long long a[10010],b[10010],c[10010];
long long sum;
long long n;
bool pd(){
for(int i=2;i<=n;i++){
if(a[i-1]>a[i]){
return false;
}
}
return true;
}
bool zh(){
sum++;
for(int i=1;i<=n;i++){
b[c[i]]=a[i];
}
for(int i=1;i<=n;i++){
a[i]=b[i];
}
if(pd()) return true;
else return false;
}
int main(){
freopen("officer.in","r",stdin);
freopen("officer.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
a[i]=i;
cin>>c[i];
}
while(true){
sum++;
if(zh()){
cout<<sum;
exit(0);
}
}
return 0;
}