100 atcoder#AGC008E. [AGC008E] Next or Nextnext

[AGC008E] Next or Nextnext

配点 : 14001400

問題文

長さ NN の数列 aa が与えられます。 11 から NN までの整数の順列 pp であって、次の条件を満たすものは何通りでしょうか? 109+710^9 + 7 で割った余りを求めてください。

  • 1iN1 \leq i \leq N について、pi=aip_i = a_i または ppi=aip_{p_i} = a_i の少なくとも一方が成り立つ。

制約

  • 1N1051 \leq N \leq 10^5
  • aia_i は整数である。
  • 1aiN1 \leq a_i \leq N

入力

入力は以下の形式で標準入力から与えられる。

NN

a1a_1 a2a_2 ...... aNa_N

出力

条件を満たす順列 pp の個数を 109+710^9 + 7 で割った余りを出力せよ。

3
1 2 3
4

次の 44 通りです。

  • (1,2,3)(1, 2, 3)
  • (1,3,2)(1, 3, 2)
  • (3,2,1)(3, 2, 1)
  • (2,1,3)(2, 1, 3)

たとえば (1,3,2)(1, 3, 2) は、p1=1p_1 = 1, pp2=2p_{p_2} = 2, pp3=3p_{p_3} = 3 となっています。

2
1 1
1

次の 11 通りです。

  • (2,1)(2, 1)
3
2 1 1
2

次の 22 通りです。

  • (2,3,1)(2, 3, 1)
  • (3,1,2)(3, 1, 2)
3
1 1 1
0
13
2 1 4 3 6 7 5 9 10 8 8 9 11
6