トピックへのリンク: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){限界<< = 1。L ++ ;} 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 }