LOJ166ラグランジュ[2畳み込み、NTT]

トピックへのリンク:LOJ

タイトル説明:入力多項式数の$ n $、整数の$ M $と$ F(0)、F(1)、F(2)、\ ldots、F(N)$、出力の$ F(M)、F (M + 1)、F(M + 2)、\ ldots、F(M + N)$

データの範囲:$ 1 \当量のn \の当量10 ^ 5、N <M \当量10 ^ 8 $

ラグランジュ補間テンプレートのマントに身を包んだトピックの数。

$$ F(M + 1)= \ sum_ {J = 0} ^ NF(J)\ dfrac {\ prod_ {k個の\ない= J}(M + 1 IK)} {\ prod_ {k個の\ない= J}( JK)} $$

$$ = \ dfrac {(M + I)!} {(M-N + I-1)!} \ Sum_ {J = 0} ^ n個の\ dfrac {F(j)*( - 1)^ {ニュージャージー} } {J!*(NJ)!} * \ FRAC {1} {M + IJ} $$

プレ階乗、逆、逆要因、および$ mfac [I] = \ prod_ {J = 0} ^ {I-1}(M-N + J)$、$ M-N + iが逆元を$そして$ mfac [i]は$逆要素。

NTT時間の複雑さを$ O(nは\ログN)$を用いて計算されます

1の#include <ビット/ STDC ++ H>
 2  の#define RINTレジスタINT
 3  使用して 名前空間STDを、
4のtypedef 長い LL。
5  のconst  int型 N = 1 << 19、MOD = 998244353、G = 3、Giの= 332748118 6インラインINT霞(INT A、INT B){
 7      INT RES = 1 8      一方、(B){
 9          もし(B&1)RES =(LL)RES *%のMOD。
10          =(LL)A *%のMOD。
11          B >> = 1 12      }
 13の     リターンRES。
14  }
 15  のint REV [N]。
16インラインINT calrev(INT LEN){
 17      のint L = - 1、限界= 1 18      一方(限界<= LEN){限界<< = 1L ++ ;}
 19      (RINT i = 0 ; iが限度を<; I ++)はREV [I] =(REV [I >> 1] >> 1)| ((I&1)<< L)。
20      戻り限界;
21  }
 22インラインボイド NTT(INT * A、INTの限界、int型タイプ){
 23      のための(iは= RINT 0 ; iが限度を<; I ++の)場合(iは< REV [i])とスワップ([I]、 [REV [I])。
24      のために(RINTミッド= 1 ;ミッド<リミット;中間<< = 1 ){
 25          INT Wnは=かすみ(タイプ== 1 G:Giの、(MOD - 1)/(中間<< 1 ))。
26          のための(RINTのJ = 0 ; J <限界J + =中間<< 1 ){
 27              INT W = 1 28              のための(RINTのK = 0 ; K <MIDがLL(= W、++ K)W *のWN%のMOD){
 29                  INT * A [j個の+ W X = A [J + K]、Y =(LL) K +中間]%MOD。
30                  A [J + K] =(X + Y)%MOD。
31                  A [J + K +中間] =(X - Y + MOD)%MOD。
32              }
 33          }
 34      }
 35      であれば(タイプ== - 1 ){
 36          、INTINV =かすみ(限界、MOD - 2 )。
37          のために(RINT i = 0 ; iが限度を<; I ++)はA [I] =(LL)A [I] * INV%MOD。
38      }
 39  }
 40  のint FAC [N]、invfac [N]、[N] INV、mfac [N]、minvfac [N]、MINV [N]。
41インラインボイドのinit(INT N、int型M){
 42      FAC [ 0 ] = mfac [ 0 ] = 1 43      のために(RINT i = 1 ; iは= <(N << 1 | 1 ; iが++){)
 44         FAC [i]は=(LL)FAC [I - 1 ] * I%MOD。
45          mfac [I] =(LL)mfac [I - 1 ] *(M - N + I - 1)%MOD。
46      }
 47      invfac [N << 1 | 1 ] =かすみ(FAC [N << 1 | 1 ]、MOD - 2 )。
48      minvfac [N << 1 | 1 ] =かすみ(mfac [N << 1 | 1 ]、MOD - 2 )。
49      のために(RINT I =(N << 1 | 1); I; I -){
 50          invfac [I - 1 ] =(LL)invfac [I] * I%MOD。
51          minvfac [I - 1 ] =(LL)minvfac [I] *(M - N + I - 1)%MOD。
52の          INV [I] =(LL)invfac [I] * FAC [I - 1 ]%MOD。
53          MINV [I] =(LL)minvfac [I] * mfac [I - 1 ]%MOD。
54      }
 55      MINVは[ 0 ] = 1 56  }
 57  int型N、M、F [N]、A [N]、B [N]。
58  INT メイン(){
 59      のscanf(" %d個%のD "、&​​N、&M)。
60      のために(RINT I = 0のscanf(; iは<= N I ++)は、 " %のD "で、f + I)。
61      INIT(N、M);
62      のint = calrev限界(N * 3 )。
63      のためには(RINT iは= 0 ; iが<= N; iは++ ){
 64          A [i]がF =(LL)[I] * invfac [I]%のMOD * invfac [N - I]%MOD。
65          であれば(N - I&1)A [I] = MOD - [I]。
66      }
 67      のために(RINT i = 0 ; iが<=(N <<1); iは++)B [I] = MINV [I + 1 ]。
68      NTT(A、限界、1)。NTT(B、限界、1 )。
69      のために(RINT i = 0 ; iが限度を<; I ++)はA [I] =(LL)A [I] * B [i]は%MOD。
70      NTT(A、限界、 - 1 )。
71      のために(; iは=(N << <RINT I = N 1 I ++;) 72          のprintf(" %dの"、(LL)mfac [iが+ 1%のMOD * A - ] * minvfac [N i]を[I]%のMOD)。
73 }
LOJ166

 

おすすめ

転載: www.cnblogs.com/AThousandMoons/p/11128598.html