[LOJ#162]テンプレートタイトル - 2のクイックパワー

< トピックリンク >

注意:これは、ことも、テンプレートを疑問視。

注2:$ P = 998224352 $

注3:$ \ 100%の$データ、$ n個の\当量5 \回10 ^ 6 $のために

この質問は、もし電源が直接可能かつ迅速にTを飛ぶ(それでも、多くの場合、マスターカードは...... $ 997ms $を持っていた参照)すべきであるという考えに触発されています。

そう

アクトワン:直接的かつ迅速なパワー

複雑さ:$ \シータ(N \ログP)$

電源に直接かつ迅速に言っても過言ではありません。

方法2:魔法のブロックのアイデア

より求めているので、私たちは前処理を検討してください。

我々は$ kが$に対処するとします。

インデックス内の柿の私たち。

彼らは以下のとおりです。

$$ \大X ^ Y = X ^ {Yの\ \ MOD \、K} \倍X ^ {\左\ lfloor \ FRAC {Y} {K} \右\ rfloor \回K} $$

その後、$ \シータは、(1)$答えすることができます

前処理$ \シータ(K + \ FRAC {P} {K})の$

その後、$ K = P ^ {\ FRAC {1} {2}} + 1 $、最適な複雑さの$ \シータ(P ^ {\ FRAC {1} {2}} + N)$($ + 1を達成することができるがかかります$ $ \ SQRT {P}丸め精度をひざまずい$)を防止することです

#include <iostreamの> 
する#include <CStringの> 
する#include <cstdioを> 
する#include <cmath> 

使用して名前空間std。
const int型のMod = 998244352、のSqrt = 31596; 
長い長いヴァル[32000]、バン[32000]、VD、QN。
メインINT(){ 
    長い長Q。
    scanf関数( "%のLLDの%のLLD"、&VD、&QN)。
    ヴァル[0] = 1。
    ヴァル[1]のVD%モジュレーションを=。
    以下のために(INT I = 2; I <=のSqrt; iは++)のval [I] = valの[I - 1] * VD%のMod。// coutの<<ヴァル[I] <<」「; 
    ヴァン[0] = 1; 
    バン[1] = valの[開平演算]。
    以下のために(INT I = 2; I <=のSqrt; iは++)ヴァン[I] =バン[I - 1] *ヴァル[開平演算]%のMod。
    以下のために(INT I = 1; I <= QN; iは++){ 
        scanf関数( "%のLLD"、&Q)。
        // COUT <<ヴァル[Q%のSqrt] <<」「<<ヴァン[Q /開平演算] << ENDL。
        printf( "%のLLD"、ヴァル[Qの%のSqrt] *バン[Q /開平演算]%MOD)。
    } 
    プット( "")。
}

 私はエキサイティングなコードをフォーマットすると言っている......

おすすめ

転載: www.cnblogs.com/kalginamiemeng/p/11647132.html