DP +プレフィックスツリーと最適化されたnkoj P3723

ベンチマークの説明:タイム1000msで
問題の説明

[問題の説明]

    また、バオガスとして知られているポーバッチドラゴン、。恐竜が絶滅しているが、数千年が、ポーバッチ竜は厳しいままで、この世界に住んで、多くの場合、宝物を作りました。

    山たら、山は防空壕の多くの黒屈原馬の恐れがあり、ダッグアウトのアスペルギルス馬の恐怖のそれぞれが宝バッチドラゴンの数を持って、ポーバッチドラゴンは同じ宝物を行いました。

山は山で唯一の丘で、かつてありました。山のストリップまでの山道がたくさんあり、各ルートの終わりには、丘の上です。

丘の頂上には黒い屈原馬のダッグアウトの恐れがある防空壕、多くの黒い山の歌馬の恐れがあります。防空壕のアスペルギルス馬恐れの頂上に加えて、山防空壕の他のすべての黒ク馬恐れがサミットの方向に行くことができ、この方向は一意です。上り坂散歩に向けてダッグアウトの黒リネンの恐怖から曲防空壕の別の黒屈原馬の恐怖に到達するためにいくつかの距離の後、この避難所に到達するためのアスペルギルス馬は防空壕の屈原馬の恐怖下にそのブラックホールの恐怖に呼びかけました。

塹壕の各黒ク馬恐れが宝バッチドラゴンの数を有する、麻の各塹壕恐れのアスペルギルス容量が制限され、宝バッチ番号は、生きるために塹壕の長すぎるアスペルギルス馬恐れることができませんそれ以外の場合は非常に混雑になります。

ポーバッチドラゴンは正確に穴がない限り、彼らは生活の屈原馬の恐怖ダッグアウト各ホールの黒竜の宝バッチの数は黒竜の宝バッチの数生きるためにダッグアウトのこの曲馬の恐怖を超えることができないと信じて、同じ宝物を作りました住んでいました。このルールに違反した場合、それは彼らがもはや承認宝物ロング、絶滅からポーバッチ龍ある、FABAOは失敗です。

今、あなたは、麻の恐怖のダッグアウトポーバッチ竜をアスペルギルスのそれぞれの能力を知っているあなたは、分布のどのように多くの山々を計算します。

入力形式

シェルター麻恐れアスペルギルスの数を表す第1のライン整数。数によって各アスペルギルス麻恐怖シェルター、前記上部のアスペルギルス麻恐怖シェルターの数。

アスペルギルス馬恐怖、すなわち、塹壕i番目の能力を示す第2のライン整数、i番目のは、ロングバオバッチアスペルギルス麻恐れエアレイドシェルターの数が範囲内にとどまらなければなりません。

3番目の列、整数、i番目の番号i + 1ホール馬アスペルギルスシェルター番号を恐れるに表示されています。

出力フォーマット

ライン山ロングバオバッチ番号モッズ1234567891の分布を表す整数(これは素数である)の結果。 

サンプル入力1


2 3 3 
1 1

サンプル出力1

41

サンプル入力2


3 1 3 
1 1 

 
Fは、[I] [J]私は、ルートプレフィックスと生きることができる最適化のj番目のプログラムの数で表され、
質問のうちnodgdは本当に癌であります 
カードを押し良いスペース方程式であります
私のメモリカードを検索
探しているトップ学んシーケンスDP(それはDAG + DPと呼ばれるべきです)
コード:
//
の#include <stdio.hに> 
する#include <ビット/ STDC ++ H>
 に#define MOD 1234567891
 の#define LL長い長い 
 使用して 名前空間STDを、
#defineは 500001 maxnn 
符号なし整数をn個。
符号なし整数のC [maxnn]。
符号なし整数の和[maxnn] [ 101 ]。
符号なし整数  ラス[maxnn]、NEX [maxnn]、TOT、[maxnn] EN。
符号なし整数TOPP [maxnn]、TOT1。
ボイド(符号なし追加整数、符号なし整数のB)
{ 
    EN [ ++ TOT = B。
    NEX [TOT] = ラス[A]。
    ラス[A] = TOTを、
} 
ボイド DFS(INT P)
{ 
    ためint型 I =ラス[P]; I; I = NEX [i])とDFS(EN [I])。
    TOPP [ ++ TOT1] = P。
} 

int型のmain()
{ 
    CIN >> N。
    符号なしint型のX;
    (符号なし整数 i = 1 ; iが<= N; iが++ 
        のscanf(" %dの"、&C [I])。
    以下のための(符号なしint型 I =1 ; iがn <; iは++ 
    { 
        scanf関数(" %のD "、&x)は、
        (X、I追加 + 1 )。
    } 
    DFS(1 )。
    INT Z = 1 ; Z <= N、Z ++ 
    { 
        int型 V = TOPP [Z]。
    (符号なし整数の CII = 0 ; CII <= C [V] CII ++ 
    { 
        符号なし整数 ANS = 1 もし(CII == C [V])
        { 
            (符号無し整数 I =ラス[V]; I; I = NEX [I])
            { 
                符号なし整数 Y = EN [I]; 
                ANS =(((LL)ANS%MOD)*(和[Y] [C [Y]%のMOD))%MOD。
            } 
        } 
        
        { 
            符号なし整数今。
            int型 I =ラス[V]; I; I = NEX [I])
            {  = 0 
                符号なし整数 Y = EN [I];
                もし(CII> 0 && C [Y]> =CII) =(和[Y] [C [Y]%MOD-和[Y] [cii- 1 ] MOD +%MOD)%MOD。
                他の
                場合(=> C [Y] CII)%[Y] C]和[Y]を= MOD。
                
                { 
                    ANS = 0破ります; 
                } 
            ANS =(((LL)ANS%MOD)*(現在%のMOD))%MOD。
            } 
        } 
        もし(CII> = 1 
            の和[V] [CII] =(和[V] [cii- 1 ]%のMOD + ANS%のMOD)%MOD。
        
        { 
            和[V] [CII] = ANS%のMOD。
        } 
    } 
    } 
    のprintf(" %d個の\ n "、和[ 1 ] [C [ 1 ]%のMOD)。
}

 

おすすめ

転載: www.cnblogs.com/OIEREDSION/p/11314185.html