tarjan強いさえデフレポイント--cf711D

テンプレートのタイトル

#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を' ; 
}

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/11432798.html