l c m ( a , b ) = a ∗ b g c d ( a , b ) lcm(a, b) = \frac{a*b}{gcd(a,b)} lcm(a,b)=gcd(a,b)a∗b <1>
我们设 n =
p
1
e
1
∗
p
2
e
2
∗
.
.
.
∗
p
n
e
n
p_1^{e_1} * p_2^{e_2} * ... * p_n^{e_n}
p1e1∗p2e2∗...∗pnen, 又因为我们的 lcm(a, b) = n;
所以一定有 :
a =
p
1
a
1
∗
p
2
a
2
∗
.
.
.
∗
p
n
a
n
p_1^{a_1} * p_2^{a_2} * ... * p_n^{a_n}
p1a1∗p2a2∗...∗pnan
b =
p
1
b
1
∗
p
2
b
2
∗
.
.
.
∗
p
n
b
n
p_1^{b_1} * p_2^{b_2} * ... * p_n^{b_n}
p1b1∗p2b2∗...∗pnbn
并且
a
i
≤
e
i
,
b
i
≤
e
i
a_i \le e_i, b_i \le e_i
ai≤ei,bi≤ei,但是
a
i
和
b
i
a_i 和 b_i
ai和bi,没有特定的大小关系;
即由<1> 得到:
p
1
e
1
∗
p
2
e
2
∗
.
.
.
∗
p
n
e
n
=
p
1
a
1
+
b
1
∗
p
2
a
2
+
b
2
∗
.
.
.
.
∗
p
n
a
n
+
b
n
p
1
m
i
n
(
a
1
+
b
1
)
∗
p
2
m
i
n
(
a
2
+
b
2
)
∗
.
.
.
∗
p
n
m
i
n
(
a
n
+
b
n
)
p_1^{e_1} * p_2^{e_2} * ... * p_n^{e_n} = \frac{p_1^{a_1+b_1} * p_2^{a_2+b_2} * .... * p_n^{a_n+b_n}}{p_1^{min(a_1+b_1)} * p_2^{min(a_2+b_2)} * ... * p_n^{min(a_n+b_n)}}
p1e1∗p2e2∗...∗pnen=p1min(a1+b1)∗p2min(a2+b2)∗...∗pnmin(an+bn)p1a1+b1∗p2a2+b2∗....∗pnan+bn
所以我们这儿就涉及到组合问题了,所以对每个n的因子
p
i
p_i
pi都有
2
∗
(
e
i
+
1
)
−
1
2 * (e_i + 1) -1
2∗(ei+1)−1种情况(我们确定a,b其中一个
p
i
p_i
pi的因子为
e
i
次方所以另外一个就有
e
i
种选择了
e_i次方所以另外一个就有e_i种选择了
ei次方所以另外一个就有ei种选择了减一是因为
a
i
=
b
i
=
e
i
a_i = b_i = e_i
ai=bi=ei的情况算了两遍)
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr)
#define int long long
using namespace std;
const int N = 2e5 + 10;
int h[N], idx, ans = 1;
bool f = 0, st[N];
vector<int> v;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b)
{
return a * b / gcd(a, b);
}
struct node
{
int u, v;
}e[N];
void add(int u, int v)
{
e[++idx].v = v;
e[idx].u = h[u];
h[u] = idx;
}
void dfs(int u)
{
if (st[u])
{
f = 1;
int res = v.size();
if (v[0] != u) { cout << -1 << endl; exit(0); }
if (res % 2 == 0) res /= 2;
ans = lcm(ans, res);
return;
}
st[u] = 1;
v.push_back(u);
for (int i = h[u]; i; i = e[i].u)
{
int s = e[i].v;
dfs(s);
}
v.pop_back();
}
signed main()
{
IOS;
int n, m;
cin >> n;
m = n;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (x == i) { m--; continue; }
add(i, x);
}
if (m == 0) { cout << 1 << endl; return 0;}
for (int i = 1; i <= n; i++)
{
if (!st[i]) dfs(i);
}
if (!f) ans = -1;
cout << ans << endl;
return 0;
}