并查集找环,每个环可以交换或不交换,所以就是2的次方,至少存在一个环
快速幂压缩时间复杂度
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 4e5 + 10;
int mod = 1e9 + 7;
int a[N], b[N], p[N];
LL ans(int a, int n, int mod) {
if (n == 0) return 1;
LL b = ans(a, n / 2, mod);
b = b * b % mod;
if (n & 1) return b * a % mod;
else return b;
}
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main() {
int t;
cin >> t;
while (t -- ) {
int n;
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i], p[i] = i;
int cnt = 0;
for (int i = 1; i <= n; i ++ ) {
cin >> b[i];
if (find(a[i]) == b[i]) cnt ++;
else p[find(b[i])] = find(a[i]);
}
cout << ans(2, cnt, mod) << endl;
}
return 0;
}
还有dfs找环