< トピックリンク >
注意:これは、ことも、テンプレートを疑問視。
注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)。 } プット( "")。 }
私はエキサイティングなコードをフォーマットすると言っている......