E ginger的染色
首先对于一个排列 ,如果看成环图的结构,那么 就向 连一条无向边。所以对于任意一个排列就会产生若干个环,连通性可以
用并查集维护,现在对每个点进行黑白染色,题意转换为对于环中任意相邻两点颜色不能相同,那么只有偶数元环才能够染色成二
分图,而每个偶环的方案数为 ,设当前有 个环,总答案就为 ,当且仅当所有的环都为偶环时存在答案,否则答案为0
ps:当时想的就是看有几个环,但是不知道怎么把它们放在一块,没想到是并查集,唉
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod=998244353,N=1e5+10; int p[N],cnt[N]; int Find(int x) { if (p[x]!=x)p[x]=Find(p[x]); return p[x]; } void merge(int a,int b) { a=Find(a),b=Find(b); if (a!=b) { p[a]=b; cnt[b]+=cnt[a]; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; for (int i=1; i<=n; i++) p[i]=i,cnt[i]=1; for (int i=1; i<=n; i++) { int x; cin>>x; merge(i,x); } int ans=1; for (int i=1;i<=n;i++) { if (p[i]==i) { if (cnt[i]%2) { printf("0\n"); return 0; } else ans=ans*2%mod; } } printf("%d\n",ans%mod); return 0; }