テンプレートのタイトル
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いっ の#define N 500005 の#define MOD十億七 int型N、[N]。 ベクター < INT > G [N]。 INT CNT、DFN [N]、低[N]、IND、STK [N]、イン[N]、トップ。 ベクター < INT > SCC [N]。 ボイド tarjan(INT X){ [X] DFN =低[X] = ++ IND。 STKの[ ++トップ] = xと、イン[X] = 1 。 以下のために(int型 i = 0 ; iは、Gを<[X] .size(); iは++ ){ INT Y = G [X] [I]; もし(!DFN [Y]){ tarjan(Y)。 低[X] = 分(低[x]は、低[Y])。 } そう であれば(INS [Y]) 低[X] = 分(低[x]は、低[Y])。 } もし(DFN [X] == 低[X]){ CNT ++。int型のyを。 実行{ Y =のSTK [top-- ]。 イン[Y] = 0 ; SCC [CNT] .push_back(Y)。 } 一方、(Y =!X)。 } } {(LLのB LL)パウLL LL RES = 1 。 一方、(B){ 場合(Bの%2 ) RES =のRES *%のMOD。 B >> = 1 ; = *%のMOD。 } 戻りRESと、 } int型のmain(){ CIN >> N。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ CIN >> [I]。 G [i]が.push_back([I])。 } のために(int型 i = 1 ; iが<= N; I ++) 場合!(DFN [i])と tarjan(I)。 LL ANS = 1 。 以下のために(int型 I = 1 ;私は= CNTを<;私は++ ) の場合(SCC [I] .size()!= 1 ) ANS = ANS *(パウ(2、SCC [I] .size()) - 2 +モッズ)%のMOD。 他の ANS = ANS * 2%のMOD。 coutの << ANS << ' \ nを' ; }