置换环
cpp
void solve(){
int n,m;
cin>>n>>m;
vector<int> a(n+1),deg(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
deg[a[i]]++;
}
if(m==1){
for(int i=1;i<=n;i++){
if(a[i]!=i){
cout<<"NO\n";
return;
}
}
cout<<"YES\n";
return;
}
vector<bool> vis(n+1);
auto dfs=[&](auto self,int x)->void{
if(--deg[a[x]]==0&&!vis[a[x]]){
vis[a[x]]=1;
self(self,a[x]);
}
};
for(int i=1;i<=n;i++){
if(deg[i]==0&&!vis[i]){
vis[i]=1;
dfs(dfs,i);
}
}
for(int i=1;i<=n;i++){
if(vis[i])continue;
int cnt=1;
vis[i]=1;
for(int j=a[i];!vis[j];j=a[j]){
vis[j]=1;
cnt++;
}
if(cnt!=m){
cout<<"NO\n";
return;
}
}
cout<<"YES\n";
}