#ifdef INCLUDE_MAIN ATT inline void Solve() { CIN( int , N , M ); if( N == 0 ){ RETURN( "0 1" ); } const MP& zero = PO::c_zero(); const MP& one = PO::c_one(); const MP two = one + one; FPS x{ 3 * N + 2 , PO( 1 , one ) }; FPS R{ 3 * N + 1 }; FOR( i , 0 , M ){ cin >> R[i]; } R /= x * x - one; R = Integral( R ); FPS eR{ Exp( R ) }; FPS G{ 2 * N + 2 , eR * x }; Shift( G , one ); assert( G.SZ() <= 2 * N + 2 ); G = MoeviusComposition( 3 * N + 2 , G , -two , zero , one , one ); assert( G.SZ() <= 3 * N + 2 ); FOR( i , 0 , 3 * N + 2 ){ G[i] *= MP::DeRP( i * 2 ) ^ N; } G = MoeviusComposition( 3 * N + 2 , G , -one , zero , one , two ); assert( G.SZ() <= 3 * N + 2 ); Shift( G , -one ); assert( G.SZ() <= 3 * N + 2 ); G /= eR; FOREQ( i , 0 , N + 1 ){ cout << G[i] << " \n"[i==N+1]; } } REPEAT_MAIN(1); #else // INCLUDE_MAIN #ifdef INCLUDE_SUB inline void Experiment() {} inline void SmallTest() {} #define INCLUDE_MAIN #include __FILE__ #else // INCLUDE_SUB #ifdef INCLUDE_LIBRARY // VVV 常設でないライブラリは以下に挿入する。 #define PO Polynomial #define FPS FormalPowerSeries #ifdef DEBUG #include "c:/Users/user/Documents/Programming/Mathematics/Polynomial/FPS/a_Body.hpp" #else // 先にConstexprModuloを貼る。 ST_AS( is_same_v> ); TE CE INT Log(INT N){INT AN = 0,pw = 1;WH(N > pw){pw <<= 1;AN++;}RE AN;} TE CL Power3Power_CE{PU:T m_val[EX_lim];CE Power3Power_CE(CO T& t);CE CO T& OP[](CRI i)CO;CE CO T(&Get()CO)[EX_lim];}; TE CE Power3Power_CE::Power3Power_CE(CO T& t):m_val(){T pw{t};for(uint EX = EX_lim - 1;EX + 1 > 0;EX--){m_val[EX]= -pw;m_val[EX]*= pw *= pw;}}TE CE CO T& Power3Power_CE::OP[](CRI i)CO{AS(i < EX_lim);RE m_val[i];}TE CE CO T(&Power3Power_CE::Get()CO)[EX_lim]{RE m_val;} // PO #define DC_OF_AR_FOR_PO(FUNC)IN PO OP FUNC(PO f)CO;IN PO OP FUNC(T t)CO #define DF_OF_AR_FOR_PO(FUNC,DEF)TE IN PO PO::OP FUNC(PO f)CO{RE MO(DEF);};TE IN PO PO::OP FUNC(T t)CO{RE *TH FUNC PO(MO(t));} TE CL PO{PU:VE m_f;int m_SZ;IN PO();IN PO(CO PO& f);IN PO(PO&& f);IN PO(VE f);IN PO(T t);IN PO(CRI i,T t);IN PO& OP=(T n);IN PO& OP=(PO f);IN PO& OP=(VE f);IN CO T& OP[](CRI i)CO;IN T& OP[](CRI i);T OP()(CO T& t)CO;PO& OP+=(CO PO& f);PO& OP-=(CO PO& f);PO& OP*=(PO f);IN PO& OP/=(CO PO& f);PO& OP/=(CO T& t);PO& OP%=(CO PO& f);PO& OP%=(CO T& t);bool OP==(CO PO& f)CO;bool OP==(CO T& t)CO;TE IN bool OP!=(CO P& f)CO;DC_OF_AR_FOR_PO(+);IN PO OP-()CO;DC_OF_AR_FOR_PO(-);DC_OF_AR_FOR_PO(*);IN PO OP/(CO PO& f)CO;IN PO OP/(CO T& t)CO;IN PO OP%(CO PO& f)CO;IN PO OP%(CO T& t)CO;IN CO VE& GetCoefficient()CO NE;IN CRI SZ()CO NE;IN VO resize(CRI deg_plus)NE;int Valuation()CO NE;IN VO swap(PO& f);IN VO swap(VE& f);VO Reduce();VO TP(CRI N_trunc);ST PO NaiveCN(PO f0,CRI valuation0,CO PO& f1,CRI valuation1,CRI N_trunc);ST PO NaiveQuotient(PO f0,CO PO& f1);ST PO NaiveResidue(PO f0,CO PO& f1);ST IN CO PO& zero();ST IN CO PO& one();ST IN CO PO& x();ST IN CO T& c_zero();ST IN CO T& c_one();ST IN CO T& c_minus_one();IN PO& SignInvert();}; // FPS TE CL FPS:PU PO{PU:int m_N;IN FPS(CRI N = 0);IN FPS(CO FPS& f);IN FPS(FPS&& f);IN FPS(CRI N,T t);IN FPS(CRI N,CO PO& f);IN FPS(CRI N,PO&& f);IN FPS(CRI N,VE&& f);IN FPS(CRI N,CRI i,T t);IN FPS& OP=(FPS f);IN FPS& OP=(T n);IN FPS& OP=(PO f);IN FPS& OP+=(CO T& t);FPS& OP+=(CO PO& f);IN FPS& OP+=(CO FPS& f);IN FPS& OP-=(CO T& t);FPS& OP-=(CO PO& f);IN FPS& OP-=(CO FPS& f);IN FPS& OP*=(CO T& t);FPS& OP*=(PO f);IN FPS& OP*=(FPS f);IN FPS& OP/=(CO T& t);IN FPS& OP/=(CO FPS& t);TE IN FPS OP+(CO P& f)CO;IN FPS OP-()CO;TE IN FPS OP-(CO P& f)CO;TE IN FPS OP*(CO P& f)CO;TE IN FPS OP/(CO P& f)CO;FPS Inverse()CO;IN VO SetTruncation(CRI N)NE;IN CRI GetTruncation()CO NE;IN FPS& TruncateInitial(CRI N)NE;IN FPS& TruncateFinal(CRI N)NE;}; TE US FPS = FPS; // FFT #define PS_FOR_FFT_BODY(MOD,LE,PR,IPR,TYPE)ST_AS((TYPE::DeRP(PR)*= TYPE::DeRP(IPR))== TYPE::DeRP(1));TE <> CE CO uint LimitOfPowerForFFT = LE - 1;TE <> IN CO TYPE(&PrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT]{ST CE Power3Power_CE> PRT{PR};ST_AS(PRT.m_val[0]== TYPE::DeRP(1));RE PRT.Get();}TE <> IN CO TYPE(&InversePrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT]{ST CE Power3Power_CE> IPRT{IPR};ST_AS(IPRT.m_val[0]== TYPE::DeRP(1)&&(TYPE::DeRP(PR)*= TYPE::DeRP(IPR))== TYPE::DeRP(1));RE IPRT.Get();}TE <> IN PO& PO::OP*=(PO f){CO int SZ = m_SZ + f.m_SZ - 1;RE *TH = FFTCN(MO(*TH),MO(f),SZ);}TE <> IN PO& PO::OP/=(CO PO& f){RE *TH = FFTQuotient(*TH,f);}TE <> IN PO& PO::OP%=(CO PO& f){RE *TH = FFTResidue(*TH,f);} #define PS_FOR_FFT(MOD,LE,PR,IPR,MINT)PS_FOR_FFT_BODY(MOD,LE,PR,IPR,MINT) TE CE CO int LimitOfPowerForFFT;TE IN CO T(&PrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT];TE IN CO T(&InversePrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT]; TE VO CooleyTukey(VE& f,CRI N_shift,CRI N_input_start,CRI N_input_lim,CRI N_trunc,CRI two_pw,CRI EX,CO T(&PRT)[LimitOfPowerForFFT]){AS(N_input_lim - N_input_start <= two_pw);CO int N_zero = N_shift + N_input_start,le = N_zero + two_pw;AS(N_zero <= N_trunc && int(f.SZ()) <= le);CO int N_input_final = min(N_input_start + two_pw,int(f.SZ()));for(int i = N_input_lim;i < N_input_final;i++){f[i]= T{};}WH(int(f.SZ())< le){f.push_back(T{});}ST VE bit_reverse[32]={VE(1)};ST int e_next = 1;ST int two_pw_next = 1;ST int two_pw_next2 = 2;ST VE* p_bit_reverse_prev = bit_reverse;ST VE* p_bit_reverse_curr = p_bit_reverse_prev + 1;WH(e_next <= EX){*p_bit_reverse_curr = VE(two_pw_next2);int* p_bit_reverse_curr_i = &((*p_bit_reverse_curr)[0]);int* p_bit_reverse_curr_i_plus = p_bit_reverse_curr_i + two_pw_next;int* p_bit_reverse_prev_i = &((*p_bit_reverse_prev)[0]);for(int i = 0;i < two_pw_next;i++){(*(p_bit_reverse_curr_i_plus++)= *(p_bit_reverse_curr_i++)= *(p_bit_reverse_prev_i++)* 2)+= 1;}e_next++;swap(two_pw_next,two_pw_next2);two_pw_next2 *= 4;p_bit_reverse_prev++;p_bit_reverse_curr++;}CO VE& bit_reverse_EX = bit_reverse[EX];int bit_num = 0;CO int* p_bit_num_reverse = &(bit_reverse_EX[bit_num]);WH(bit_num < two_pw){if(*p_bit_num_reverse < bit_num){swap(f[*p_bit_num_reverse + N_input_start],f[bit_num + N_input_start]);}bit_num++;p_bit_num_reverse++;}CO T& one = PRT[0];T zeta,diff;int i,j,j_lim,two_pw_curr = 1,two_pw_curr_2 = 2;WH(two_pw_curr < two_pw){CO int N_input_final_curr = N_input_start + two_pw_curr;bit_num = 0;i = 0;zeta = one;WH(i < two_pw){j = i;j_lim = i + two_pw_curr;WH(j < j_lim){diff = f[j + N_input_start]- f[j + N_input_final_curr];f[j + N_input_start]+= f[j + N_input_final_curr];f[j + N_input_final_curr]= zeta * diff;j++;}bit_num++;i += two_pw_curr_2;j = 0;WH(true){if(((bit_num >> j)& 1)== 1){zeta *= PRT[j+1];break;}j++;}}two_pw_curr <<= 1;two_pw_curr_2 <<= 1;}if(N_trunc < le){f.resize(N_trunc);}if(N_shift > 0){for(int i = min(le,N_trunc)- 1;i >= N_zero;i--){f[i]= MO(f[i - N_shift]);}for(int i = min(le,N_zero)- 1;i >= N_input_start;i--){f[i]= T{};}}RE;}TE IN VO FFT(VE& f,CRI N_input_start,CRI N_input_lim,CRI two_pw,CRI EX){CooleyTukey(f,0,N_input_start,N_input_lim,N_input_start + two_pw,two_pw,EX,PrimitiveRootOfTwoForFFT());}TE IN VO IFFT(VE& f,CRI N_shift,CRI N_input_start,CRI N_input_lim,CRI N_trunc,CRI two_pw,CO T& two_pw_inv,CRI EX){CooleyTukey(f,N_shift,N_input_start,N_input_lim,N_trunc,two_pw,EX,InversePrimitiveRootOfTwoForFFT());CO int SZ = f.SZ();for(int i = N_shift + N_input_start;i < SZ;i++){f[i]*= two_pw_inv;}}TE PO FFTCN(PO f0,PO f1,CRI N_trunc){f0.Reduce();if(f0.m_SZ == 0){RE MO(f0);}f1.Reduce();if(f1.m_SZ == 0){RE MO(f1);}AS(f0.m_SZ <= N_trunc);CO int valuation0 = f0.Valuation();CO int valuation1 = f1.Valuation();if(N_trunc <= valuation0 + valuation1){RE f0.zero();}CO int le0 = f0.m_SZ - valuation0;CO int le1 = min(f1.m_SZ,N_trunc)- valuation1;CO int le = le0 + le1 - 1;CO int EX = Log(le);if(min(le0,le1)<= EX){RE f0.NaiveCN(MO(f0),valuation0,MO(f1),valuation1,min(f0.m_SZ + f1.m_SZ - 1,N_trunc));}CO int two_pw = 1 << EX;FFT(f0.m_f,valuation0,f0.m_SZ,two_pw,EX);FFT(f1.m_f,valuation1,valuation1 + le1,two_pw,EX);for(int i = 0;i < two_pw;i++){f0.m_f[i + valuation0]*= f1.m_f[i + valuation1];}IFFT(f0.m_f,valuation1,valuation0,valuation0 + two_pw,N_trunc,two_pw,f0.c_one()/ two_pw,EX);f0.m_SZ = f0.m_f.SZ();RE MO(f0);}TE PO FFTQuotient(PO& f0,PO f1){f0.Reduce();f1.Reduce();AS(f1.m_SZ > 0);if(f0.m_SZ < f1.m_SZ){RE PO::zero();}CO int f0_TP_SZ = f0.m_SZ - f1.m_SZ + 1;CO int f1_TP_SZ = min(f0_TP_SZ,f1.m_SZ);f1.TP(f1_TP_SZ);CO FPS f1_TP_inverse = FPS(f0_TP_SZ,MO(f1)).Inverse();f0.TP(f0_TP_SZ);FPS f0_TP{f0_TP_SZ,MO(f0)};f0_TP *= f1_TP_inverse;f0_TP.TP(f0_TP_SZ);RE f0_TP;}TE PO FFTResidue(PO& f0,PO f1){f0.Reduce();f1.Reduce();AS(f1.m_SZ > 0);if(f0.m_SZ >= f1.m_SZ){f0 -=(f0 / f1)* f1;f0.Reduce();}RE MO(f0);} PS_FOR_FFT(P,24,31,128805723,Mod); PS_FOR_FFT(167772161,26,17,29606852,Mod); PS_FOR_FFT(469762049,27,30,15658735,Mod); PS_FOR_FFT(754974721,25,362,415027540,Mod); // FPS TE IN FPS::FPS(CRI N):PO(),m_N(N){}TE IN FPS::FPS(CO FPS& f):PO(f),m_N(f.m_N){}TE IN FPS::FPS(FPS&& f):PO(MO(f.m_f)),m_N(f.m_N){}TE IN FPS::FPS(CRI N,T t):PO(MO(t)),m_N(N){AS(m_N > 0);}TE IN FPS::FPS(CRI N,CO PO& f):PO(),m_N(N){AS(m_N > 0);TH->m_SZ = f.m_SZ < m_N?f.m_SZ:m_N;TH->m_f = VE(TH->m_SZ);for(int i = 0;i < TH->m_SZ;i++){TH->m_f[i]= f.m_f[i];}}TE IN FPS::FPS(CRI N,PO&& f):PO(),m_N(N){if(f.m_SZ < m_N * 2){PO::OP=(MO(f));if(f.m_SZ > m_N){TruncateFinal(m_N);}}else{TH->m_f = VE(m_N);for(int i = 0;i < m_N;i++){TH->m_f[i]= MO(f.m_f[i]);}TH->m_SZ = m_N;}}TE IN FPS::FPS(CRI N,VE&& f):PO(),m_N(N){AS(m_N > 0);CO int f_SZ = f.SZ();if(f_SZ < m_N * 2){PO::OP=(MO(f));if(f_SZ > m_N){TruncateFinal(m_N);}}else{TH->m_f = VE(m_N);for(int i = 0;i < m_N;i++){TH->m_f[i]= MO(f[i]);}}}TE IN FPS::FPS(CRI N,CRI i,T t):PO(),m_N(N){AS(m_N > 0);if(i < m_N?t != TH->c_zero():false){(*TH)[i]= MO(t);}}TE IN FPS& FPS::OP=(FPS f){PO::OP=(MO(f.m_f));m_N = f.m_N;RE *TH;}TE IN FPS& FPS::OP=(T n){PO::OP=(MO(n));RE *TH;}TE IN FPS& FPS::OP=(PO f){RE OP=(FPS(m_N,MO(f)));}TE IN FPS& FPS::OP+=(CO T& t){PO::OP+=(t);RE *TH;}TE FPS& FPS::OP+=(CO PO& f){CRI SZ_f = m_N < f.m_SZ?m_N:f.m_SZ;CRI SZ = TH->m_SZ < SZ_f?TH->m_SZ:SZ_f;for(int i = 0;i < SZ;i++){TH->m_f[i]+= f.m_f[i];}for(int i = SZ;i < SZ_f;i++){TH->m_f.push_back(f.m_f[i]);}TH->m_SZ = TH->m_f.SZ();RE *TH;}TE IN FPS& FPS::OP+=(CO FPS& f){AS(m_N <= f.m_N);CO PO& f_ref = f;RE OP+=(f_ref);}TE IN FPS& FPS::OP-=(CO T& t){PO::OP-=(t);RE *TH;}TE FPS& FPS::OP-=(CO PO& f){CRI SZ_f = m_N < f.m_SZ?m_N:f.m_SZ;CRI SZ = TH->m_SZ < SZ_f?TH->m_SZ:SZ_f;for(int i = 0;i < SZ;i++){TH->m_f[i]-= f.m_f[i];}for(int i = SZ;i < SZ_f;i++){TH->m_f.push_back(-f.m_f[i]);}TH->m_SZ = TH->m_f.SZ();RE *TH;}TE IN FPS& FPS::OP-=(CO FPS& f){AS(m_N <= f.m_N);CO PO& f_ref = f;RE OP-=(f_ref);}TE IN FPS& FPS::OP*=(CO T& t){PO::OP*=(t);RE *TH;}TE FPS& FPS::OP*=(PO f){*TH = FFTCN(forward>(*TH),MO(f),m_N);RE *TH;}TE IN FPS& FPS::OP*=(FPS f){AS(m_N <= f.m_N);RE OP*=(forward>(f));}TE IN FPS& FPS::OP/=(CO T& t){PO::OP/=(t);RE *TH;}TE IN FPS& FPS::OP/=(CO FPS& f){AS(m_N <= f.m_N);RE OP*=(m_N == f.m_N?f.Inverse():FPS(m_N,f).Inverse());}TE TE IN FPS FPS::OP+(CO P& f)CO{RE MO(FPS(*TH)+= f);}TE IN FPS FPS::OP-()CO{RE MO(FPS(m_N)-= *TH);}TE TE IN FPS FPS::OP-(CO P& f)CO{RE MO(FPS(*TH)-= f);}TE TE IN FPS FPS::OP*(CO P& f)CO{RE MO(FPS(*TH)*= f);}TE TE IN FPS FPS::OP/(CO P& f)CO{RE MO(FPS(*TH)/= f);}TE FPS FPS::Inverse()CO{AS(TH->m_SZ > 0 && TH->m_f[0]!= TH->c_zero());CO PO& TH_ref = *TH;int pw;int pw_2 = 1;FPS f_inv{pw_2,TH->c_one()/ TH->m_f[0]};WH(pw_2 < m_N){pw = pw_2;pw_2 <<= 1;f_inv.SetTruncation(pw_2);auto temp = f_inv * TH_ref;temp[0]--;temp *= f_inv;for(int i = pw;i < pw_2;i++){f_inv[i]-= temp[i];}}f_inv.SetTruncation(m_N);RE f_inv;}TE IN VO FPS::SetTruncation(CRI N)NE{if(N < m_N){TruncateFinal(N);}m_N = N;}TE IN CRI FPS::GetTruncation()CO NE{RE m_N;}TE IN FPS& FPS::TruncateInitial(CRI N)NE{CRI SZ = N < TH->m_SZ?N:TH->m_SZ;for(int i = 0;i < SZ;i++){TH->m_f[i]= 0;}RE *TH;}TE IN FPS& FPS::TruncateFinal(CRI N)NE{WH(TH->m_SZ > N){TH->m_f.pop_back();TH->m_SZ--;}RE *TH;}TE FPS Differential(CO FPS& f){auto& SZ = f.SZ();auto& N = f.GetTruncation();if(SZ < 1){RE FPS(1 < N?N - 1:1);}VE df(SZ - 1);for(int i = 1;i < SZ;i++){df[i - 1]= f[i]* i;}RE FPS(1 < N?N - 1:1,MO(df));}TE FPS Differential(CRI n,CO FPS& f){if(n == 0){RE f;}if(n == 1){RE Differential(f);}auto& SZ = f.SZ();auto& N = f.GetTruncation();if(SZ < n){RE FPS(n < N?N - n:1);}VE df(SZ - n);T coef = T::Factorial(n),numer = n,denom = 0;for(int i = n;i < SZ;i++){df[i - n]= f[i]* coef;(coef *= ++numer)/= ++denom;}RE FPS(n < N?N - n:1,MO(df));}TE FPS ShiftedIntegral(CRI n,CO FPS& f,CRI shift){auto& SZ = f.SZ();auto& N = f.GetTruncation();if(SZ + n < shift){RE FPS{N + n > shift?N + n - shift:1};}VE F(SZ + n - shift);if(n == 0){for(int i = shift;i < SZ;i++){F[i - shift]= f[i];}}else if(n == 1){CO int i_min = max(shift - 1,0);T denom = i_min;for(int i = i_min;i < SZ;i++){F[i + 1 - shift]= f[i]/ ++denom;}}else{CO int i_min = max(shift - n,0);for(int i = i_min;i < SZ;i++){F[i + n - shift]= f[i]* T::Factorial(i)* T::FactorialInverse(n + i);}}RE FPS(N + n - shift,MO(F));}TE IN FPS Integral(CO FPS& f){RE ShiftedIntegral(1,f,0);}TE IN FPS Integral(CRI n,CO FPS& f){RE ShiftedIntegral(n,f,0);}TE FPS Exp(CO FPS& f){AS(f[0]== f.c_zero());CRI N = f.GetTruncation();int pw;int pw_2 = 1;FPS f_exp{pw_2,f.c_one()};WH(pw_2 < N){pw = pw_2;pw_2 *= 2;f_exp.SetTruncation(pw_2);auto temp = Differential(f_exp);temp /= f_exp;temp = ShiftedIntegral(1,temp,pw);for(int i = 0;i < pw;i++){temp[i]-= f[i | pw];}temp *= f_exp;for(int i = 0;i < pw;i++){f_exp[i|pw]-= temp[i];}}f_exp.SetTruncation(N);RE f_exp;}TE IN FPS Log(CO FPS& f){AS(f[0]== f.c_one());RE Integral(Differential(f)/= f);}TE IN OS& OP<<(OS& os,CO FPS& f){CO int N = f.GetTruncation();for(int i = 0;i < N;i++){(i > 0?os << " ":os)<< f[i];}RE os;} // PO TE IN PO::PO():m_f(),m_SZ(0){}TE IN PO::PO(CO PO& f):m_f(f.m_f),m_SZ(f.m_SZ){}TE IN PO::PO(PO&& f):m_f(MO(f.m_f)),m_SZ(f.m_SZ){}TE IN PO::PO(VE f):m_f(MO(f)),m_SZ(m_f.SZ()){}TE IN PO::PO(T t):PO(){if(t != c_zero()){OP[](0)= MO(t);}}TE IN PO::PO(CRI i,T t):PO(){if(t != c_zero()){OP[](i)= MO(t);}}TE IN PO& PO::OP=(T n){m_f.clear();m_SZ = 0;OP[](0)= MO(n);RE *TH;}TE IN PO& PO::OP=(PO f){m_f = MO(f.m_f);m_SZ = f.m_SZ;RE *TH;}TE IN PO& PO::OP=(VE f){m_f = MO(f);m_SZ = m_f.SZ();RE *TH;}TE IN CO T& PO::OP[](CRI i)CO{RE m_SZ <= i?c_zero():m_f[i];}TE IN T& PO::OP[](CRI i){if(m_SZ <= i){CO T& z = c_zero();WH(m_SZ <= i){m_f.push_back(z);m_SZ++;}}RE m_f[i];}TE T PO::OP()(CO T& t)CO{T AN =(*TH)[0];T t_pw = c_one();for(int d = 1;d < m_SZ;d++){AN += m_f[d]*(t_pw *= t);}RE AN;}TE PO& PO::OP+=(CO PO& f){if(m_SZ < f.m_SZ){for(int i = 0;i < m_SZ;i++){m_f[i]+= f.m_f[i];}for(int i = m_SZ;i < f.m_SZ;i++){m_f.push_back(f.m_f[i]);}m_SZ = f.m_SZ;}else{for(int i = 0;i < f.m_SZ;i++){m_f[i]+= f.m_f[i];}}RE *TH;}TE PO& PO::OP-=(CO PO& f){if(m_SZ < f.m_SZ){for(int i = 0;i < m_SZ;i++){m_f[i]-= f.m_f[i];}for(int i = m_SZ;i < f.m_SZ;i++){m_f.push_back(- f.m_f[i]);}m_SZ = f.m_SZ;}else{for(int i = 0;i < f.m_SZ;i++){m_f[i]-= f.m_f[i];}}RE *TH;}TE PO& PO::OP/=(CO T& t){if(t == c_one()){RE *TH;}CO T t_inv{c_one()/ t};for(int i = 0;i < m_SZ;i++){OP[](i)*= t_inv;}RE *TH;}TE PO& PO::OP%=(CO T& t){if(t == c_one()){RE *TH = zero();}for(int i = 0;i < m_SZ;i++){m_f[i]%= t;}RE *TH;}TE bool PO::OP==(CO PO& f)CO{CRI SZ0 = SZ();CRI SZ1 = f.SZ();CRI SZ_max = SZ0 < SZ1?SZ1:SZ0;for(int i = 0;i < SZ_max;i++){if(OP[](i)!= f[i]){RE false;}}RE true;}TE bool PO::OP==(CO T& t)CO{CRI SZ_max = SZ();CO T& zero = PO::c_zero();for(int i = 1;i < SZ_max;i++){if(m_f[i]!= zero){RE false;}}RE OP[](0)== t;}TE TE IN bool PO::OP!=(CO P& f)CO{RE !(*TH == f);}DF_OF_AR_FOR_PO(+,f += *TH);TE IN PO& PO::SignInvert(){Reduce();for(auto& fi:m_f){fi = -fi;}RE *TH;}TE IN PO PO::OP-()CO{RE MO(PO(*TH).SignInvert());}DF_OF_AR_FOR_PO(-,f.SignInvert()+= *TH);DF_OF_AR_FOR_PO(*,f *= *TH);TE IN PO PO::OP/(CO T& t)CO{RE MO(PO(*TH)/= t);}TE IN PO PO::OP/(CO PO& f)CO{RE MO(PO(*TH)/= f);}TE IN PO PO::OP%(CO T& t)CO{RE MO(PO(*TH)%= t);}TE IN PO PO::OP%(CO PO& f)CO{RE MO(PO(*TH)%= f);}TE IN CO VE& PO::GetCoefficient()CO NE{RE m_f;}TE IN CRI PO::SZ()CO NE{RE m_SZ;}TE IN VO PO::resize(CRI deg_plus)NE{m_f.resize(m_SZ = deg_plus);}TE int PO::Valuation()CO NE{for(int i = 0;i < m_SZ;i++){if(m_f[i]!= c_zero()){RE i;}}RE -1;}TE IN VO PO::swap(PO& f){m_f.swap(f.m_f);swap(m_SZ,f.m_SZ);}TE IN VO PO::swap(VE& f){m_f.swap(f);m_SZ = m_f.SZ();}TE VO PO::Reduce(){CO T& z = c_zero();WH(m_SZ > 0 && m_f[m_SZ - 1]== z){m_f.pop_back();m_SZ--;}RE;}TE VO PO::TP(CRI N_trunc){WH(N_trunc > m_SZ){m_f.push_back(c_zero());m_SZ++;}CO int N_half = min(N_trunc,(m_SZ + 1)/ 2);for(int d = 0;d < N_half;d++){::swap(m_f[d],m_f[m_SZ - 1 - d]);}m_f.resize(N_trunc);m_SZ = N_trunc;RE;}TE IN CO PO& PO::zero(){ST CO PO z{};RE z;}TE IN CO PO& PO::one(){ST CO PO o{c_one()};RE o;}TE IN CO PO& PO::x(){ST CO PO f{1,c_one()};RE f;}TE IN CO T& PO::c_zero(){ST CO T z{0};RE z;}TE IN CO T& PO::c_one(){ST CO T o{1};RE o;}TE IN CO T& PO::c_minus_one(){ST CO T m{-1};RE m;}TE PO Differential(CRI n,CO PO& f){CRI SZ = f.SZ();if(SZ < n){RE PO::zero();}VE df(SZ - n);T coef = T::Factorial(n);int i = n;WH(i < SZ){df[i - n]= f[i]* coef;i++;(coef *= i)/=(i - n);}RE PO(MO(df));}TE IN PO Differential(CO PO& f){RE Differential(1,f);} TE PO PO::NaiveCN(PO f0,CRI valuation0,CO PO& f1,CRI valuation1,CRI N_trunc){CO int SZ0 = f0.SZ();AS(0 <= valuation0 && valuation0 < SZ0);CO int SZ1 = f1.SZ();AS(0 <= valuation1 && valuation1 < SZ1);for(int i = SZ0 - 1;i >= valuation0;i--){CO T f0i = f0[i];f0[i]*= f1[0];CO int j_ulim = min(SZ1,N_trunc - i),j_min = max(valuation1,1);for(int j = j_ulim - 1;j >= j_min;j--){f0[i+j]+= f0i * f1[j];}}RE MO(f0);}TE IN OS& OP<<(OS& os,CO PO& f){auto& SZ = f.SZ();for(int i = 0;i < SZ;i++){(i == 0?os:os << " ")<< f[i];}RE os;} #endif #ifdef DEBUG #include "c:/Users/user/Documents/Programming/Mathematics/Polynomial/FPS/IteratedArithmetic/a_Body.hpp" #else #define DF_OF_PROD(RECURSION,UNIT,APPLY)if(f.empty()){f.push_back(UNIT);}if(f.SZ()== 1){RE f.front();}auto IT = f.BE(),EN = f.EN();WH(IT != EN){auto& t = *IT;IT++;if(IT != EN){APPLY;IT = f.erase(IT);}}RE RECURSION; #define EXPRESSION2_FOR_RATIONAL_SUM {t.first * IT->second + t.second * IT->first,t.second * IT->second} // 総乗のN次打ち切り TE TY V> FPS& Prod(V>& f){DF_OF_PROD(Prod(f),FPS(1,PO::one()),t *= *IT);} // Tに拡張された冪乗のN次打ち切り。 TE IN FPS Power(CO FPS& f,CO T& t){RE Exp(Log(f)*= t);} // 冪乗のN次打ち切り。 TE FPS Power(CO FPS& f,CO INT& e){CO T& one = PO::c_one();if(f[0] == one){RE Power(f,T(e));}CO T& zero = PO::c_zero();CRI SZ = f.SZ();int v = 0;WH(v < SZ?f[v] == zero:false){v++;}CO INT ve = v * e;CRI N = f.GetTruncation();if(v == SZ || ve >= N){RE FPS(N);}FPS g(N - ve);CO T fv_inv = one / f[v];for(int d = v;d < SZ;d++){g[d - v] = f[d] * fv_inv;}g = Exp(Log(g) *= T(e)) * Power(f[v],e);g.SetTruncation(N);for(int d = N - 1;d >= ve;d--){g[d] = g[d - ve];}for(int d = 0;d < ve;d++){g[d] = zero;}RE g;} #endif #ifdef DEBUG #include "c:/Users/user/Documents/Programming/Mathematics/Polynomial/CoordinateChange/a_Body.hpp" #else // 平行移動 TE VO Shift(PO& f,CO T& t,CO bool& EXial = false){f.Reduce();CRI SZ = f.SZ();if(SZ > 0 && t != f.c_zero()){FPS exp_t_TP{SZ * 2};T pw_t = f.c_one();for(int d = 0;d < SZ;d++){exp_t_TP[SZ - 1 - d]= pw_t * T::FactorialInverse(d);pw_t *= t;}if(EXial){exp_t_TP *= f;for(int d = 0;d < SZ;d++){f[d]= exp_t_TP[d + SZ - 1];}}else{for(int d = 0;d < SZ;d++){f[d]*= T::Factorial(d);}exp_t_TP *= f;for(int d = 0;d < SZ;d++){f[d]= exp_t_TP[d + SZ - 1]* T::FactorialInverse(d);}}}RE;} // アフィン変換 TE VO AffineTransformation(PO& f,CO T& t,CO T& u,CO bool& EXial = false){Shift(f,u,EXial);CRI SZ = f.SZ();T pw = f.c_one();for(int d = 0;d < SZ;d++){f[d]*= pw;pw *= t;}RE;} #endif #ifdef DEBUG #include "c:/Users/user/Documents/Programming/Mathematics/Polynomial/FPS/Composition/a_Body.hpp" #else // メビウス変換のN次打ち切り(反転のN次打ち切りを使用) TE FPS MoeviusComposition(CRI N,PO f,T a,T b,T c,T d){CO T& zero = PO::c_zero();CO T& one = PO::c_one();if(c == zero){d = one / d;AffineTransformation(f,a *= d,b *= d);}else{a /= c;b -= a * d;if(b == zero){f = f(a);}else{b = one / b;c *= b;d *= b;Shift(f,a);CRI SZ = f.SZ();if(SZ > 0){f.TP(SZ);AffineTransformation(f,c,d);FPS g{N};g[0]= MO(d);g[1]= MO(c);f = FPS{N,MO(f)}/= Power(g,SZ - 1);}}}RE FPS(N,f);} #endif // AAA 常設でないライブラリは以上に挿入する。 #define INCLUDE_SUB #include __FILE__ #else // INCLUDE_LIBRARY // #define REACTIVE // #define USE_GETLINE #ifdef DEBUG #else #pragma GCC optimize ( "O3" ) #pragma GCC optimize ( "unroll-loops" ) #pragma GCC target ( "sse4.2,fma,avx2,popcnt,lzcnt,bmi2" ) #define REPEAT_MAIN( BOUND ) START_MAIN; CEXPR( int , bound_test_case_num , BOUND ); int test_case_num = 1; if constexpr( bound_test_case_num > 1 ){ SET_ASSERT( test_case_num , 1 , bound_test_case_num ); } FINISH_MAIN #define DEXPR( LL , BOUND , VALUE , DEBUG_VALUE ) CEXPR( LL , BOUND , VALUE ) #define ASSERT( A , MIN , MAX ) assert( ( MIN ) <= A && A <= ( MAX ) ) #define SET_ASSERT( A , MIN , MAX ) SET_LL( A ); ASSERT( A , MIN , MAX ) #define SOLVE_ONLY #define CERR( ... ) #define COUT( ... ) VariadicCout( cout , __VA_ARGS__ ) << ENDL #define CERR_A( A , N ) #define COUT_A( A , N ) OUTPUT_ARRAY( cout , A , N ) << ENDL #define CERR_ITR( A ) #define COUT_ITR( A ) OUTPUT_ITR( cout , A ) << ENDL #endif #ifdef REACTIVE #define ENDL endl #else #define ENDL "\n" #endif #ifdef USE_GETLINE #define SET_LL( A ) { GETLINE( A ## _str ); A = stoll( A ## _str ); } #define GETLINE_SEPARATE( SEPARATOR , ... ) SOLVE_ONLY; string __VA_ARGS__; VariadicGetline( cin , SEPARATOR , __VA_ARGS__ ) #define GETLINE( ... ) SOLVE_ONLY; GETLINE_SEPARATE( '\n' , __VA_ARGS__ ) #else #define SET_LL( A ) cin >> A #define CIN( LL , ... ) SOLVE_ONLY; LL __VA_ARGS__; VariadicCin( cin , __VA_ARGS__ ) #define SET_A( A , N ) SOLVE_ONLY; FOR( VARIABLE_FOR_CIN_A , 0 , N ){ cin >> A[VARIABLE_FOR_CIN_A]; } #define CIN_A( LL , A , N ) vector A( N ); SET_A( A , N ); #endif #include using namespace std; using uint = unsigned int; using ll = long long; using ull = unsigned long long; #define ATT __attribute__( ( target( "sse4.2,fma,avx2,popcnt,lzcnt,bmi2" ) ) ) #define START_MAIN int main(){ ios_base::sync_with_stdio( false ); cin.tie( nullptr ) #define FINISH_MAIN REPEAT( test_case_num ){ if constexpr( bound_test_case_num > 1 ){ CERR( "testcase " , VARIABLE_FOR_REPEAT_test_case_num , ":" ); } Solve(); CERR( "" ); } } #define TYPE_OF( VAR ) decay_t #define CEXPR( LL , BOUND , VALUE ) constexpr LL BOUND = VALUE #define CIN_ASSERT( A , MIN , MAX ) TYPE_OF( MAX ) A; SET_ASSERT( A , MIN , MAX ) #define FOR( VAR , INITIAL , FINAL_PLUS_ONE ) for( TYPE_OF( FINAL_PLUS_ONE ) VAR = INITIAL ; VAR < FINAL_PLUS_ONE ; VAR ++ ) #define FOREQ( VAR , INITIAL , FINAL ) for( TYPE_OF( FINAL ) VAR = INITIAL ; VAR <= FINAL ; VAR ++ ) #define REPEAT( HOW_MANY_TIMES ) FOR( VARIABLE_FOR_REPEAT_ ## HOW_MANY_TIMES , 0 , HOW_MANY_TIMES ) #define OUTPUT_ARRAY( OS , A , N ) FOR( VARIABLE_FOR_OUTPUT_ARRAY , 0 , N ){ OS << A[VARIABLE_FOR_OUTPUT_ARRAY] << (VARIABLE_FOR_OUTPUT_ARRAY==N-1?"":" "); } OS #define OUTPUT_ITR( OS , A ) { auto ITERATOR_FOR_OUTPUT_ITR = A.begin() , END_FOR_OUTPUT_ITR = A.end(); bool VARIABLE_FOR_OUTPUT_ITR = ITERATOR_FOR_COUT_ITR != END_FOR_COUT_ITR; while( VARIABLE_FOR_OUTPUT_ITR ){ OS << *ITERATOR_FOR_COUT_ITR; ( VARIABLE_FOR_OUTPUT_ITR = ++ITERATOR_FOR_COUT_ITR != END_FOR_COUT_ITR ) ? OS : OS << " "; } } OS #define RETURN( ... ) SOLVE_ONLY; COUT( __VA_ARGS__ ); return // 入出力用 template inline basic_istream& VariadicCin( basic_istream& is ) { return is; } template inline basic_istream& VariadicCin( basic_istream& is , Arg& arg , ARGS&... args ) { return VariadicCin( is >> arg , args... ); } template inline basic_istream& VariadicGetline( basic_istream& is , const char& separator ) { return is; } template inline basic_istream& VariadicGetline( basic_istream& is , const char& separator , Arg& arg , ARGS&... args ) { return VariadicGetline( getline( is , arg , separator ) , separator , args... ); } template inline basic_ostream& VariadicCout( basic_ostream& os , const Arg& arg ) { return os << arg; } template inline basic_ostream& VariadicCout( basic_ostream& os , const Arg1& arg1 , const Arg2& arg2 , const ARGS&... args ) { return VariadicCout( os << arg1 << " " , arg2 , args... ); } /* 圧縮用 */ #define TE template #define TY typename #define US using #define ST static #define AS assert #define IN inline #define CL class #define PU public #define OP operator #define CE constexpr #define CO const #define NE noexcept #define RE return #define WH while #define VO void #define VE vector #define LI list #define BE begin #define EN end #define SZ size #define LE length #define MO move #define TH this #define CRI CO int& #define CRUI CO uint& #define CRL CO ll& #define VI virtual #define IS basic_istream #define OS basic_ostream #define ST_AS static_assert #define reMO_CO remove_const #define is_COructible_v is_constructible_v #define rBE rbegin // VVV 常設ライブラリは以下に挿入する。 /* ConstexprModulo (8KB) */ CEXPR(uint,P,998244353); #define RP Represent #define DeRP Derepresent TE CE INT Residue(INT n)NE{RE MO(n < 0?((((++n)*= -1)%= M)*= -1)+= M - 1:n < INT(M)?n:n %= M);}TE CE INT& ResidueP(INT& n)NE{CE CO uint trunc =(1 << 23)- 1;INT n_u = n >> 23;n &= trunc;INT n_uq =(n_u / 7)/ 17;n_u -= n_uq * 119;n += n_u << 23;RE n < n_uq?n += P - n_uq:n -= n_uq;} TE IN INT ModularInverse(CO INT& base,ll c){AS(base > 0);ll a[2]={0,1 % base};INT b[2]={base,INT((c %= base)< 0?c += base:c)};WH(b[1]!= 0){CO INT q = b[0]/ b[1];(a[0]-= q * a[1]% base)< 0?a[0]+= base:a[0];b[0]-= q * b[1];swap(a[0],a[1]);swap(b[0],b[1]);}AS(b[0]== 1 &&(a[0]* c - 1)% base == 0);RE a[0];} TE CL Mod;TE CL COantsForMod{PU:COantsForMod()= delete;ST CE CO uint g_memory_bound = 2e6;ST CE CO uint g_memory_le = M < g_memory_bound?M:g_memory_bound;ST CE uint g_Mm = M - 1;ST CE int g_order = M - 1;ST CE int g_orderm = g_order - 1;}; #define SFINAE_FOR_MOD enable_if_t>>* #define DC_OF_CM_FOR_MOD(OPR)CE bool OP OPR(CO Mod& n)CO NE #define DC_OF_AR_FOR_MOD(OPR,EX)CE Mod OP OPR(Mod n)CO EX #define DF_OF_CM_FOR_MOD(OPR)TE CE bool Mod::OP OPR(CO Mod& n)CO NE{RE m_n OPR n.m_n;} #define DF_OF_AR_FOR_MOD(OPR,EX,LEFT,OPR2)TE CE Mod Mod::OP OPR(Mod n)CO EX{RE MO(LEFT OPR2 ## = *TH);}TE CE Mod OP OPR(T n0,CO Mod& n1)EX{RE MO(Mod(MO(n0))OPR ## = n1);} TE CL Mod{PU:uint m_n;CE Mod()NE;CE Mod(CO Mod& n)NE;CE Mod(Mod&& n)NE;TE CE Mod(T n)NE;CE Mod& OP=(Mod n)NE;CE Mod& OP+=(CO Mod& n)NE;CE Mod& OP-=(CO Mod& n)NE;CE Mod& OP*=(CO Mod& n)NE;IN Mod& OP/=(Mod n);CE Mod& OP^=(ll EX);CE Mod& OP<<=(ll n);CE Mod& OP>>=(ll n);CE Mod& OP++()NE;CE Mod OP++(int)NE;CE Mod& OP--()NE;CE Mod OP--(int)NE;DC_OF_CM_FOR_MOD(==);DC_OF_CM_FOR_MOD(!=);DC_OF_CM_FOR_MOD(<);DC_OF_CM_FOR_MOD(<=);DC_OF_CM_FOR_MOD(>);DC_OF_CM_FOR_MOD(>=);DC_OF_AR_FOR_MOD(+,NE);DC_OF_AR_FOR_MOD(-,NE);DC_OF_AR_FOR_MOD(*,NE);DC_OF_AR_FOR_MOD(/,);CE Mod OP^(ll EX)CO;CE Mod OP<<(ll n)CO;CE Mod OP>>(ll n)CO;CE Mod OP-()CO NE;CE VO swap(Mod& n)NE;CE CRUI RP()CO NE;ST CE Mod DeRP(uint n)NE;ST IN CO Mod& Factorial(CRL n);ST IN CO Mod& FactorialInverse(CRL n);ST IN Mod Combination(CRL n,CRL i);ST IN CO Mod& zero()NE;ST IN CO Mod& one()NE;ST CE uint GetModulo()NE;CE Mod& SignInvert()NE;IN Mod& Invert();CE Mod& PPW(ll EX)NE;CE Mod& NNPW(ll EX)NE;ST IN CO Mod& Inverse(CRI n);ST IN CO Mod& TwoPower(CRI n);ST IN CO Mod& TwoPowerInverse(CRI n);US COants = COantsForMod;}; US MP = Mod

; TE CE Mod::Mod()NE:m_n(){}TE CE Mod::Mod(CO Mod& n)NE:m_n(n.m_n){}TE CE Mod::Mod(Mod&& n)NE:m_n(MO(n.m_n)){}TE TE CE Mod::Mod(T n)NE:m_n(Residue(MO(n))){}TE CE Mod& Mod::OP=(Mod n)NE{m_n = MO(n.m_n);RE *TH;}TE CE Mod& Mod::OP+=(CO Mod& n)NE{(m_n += n.m_n)< M?m_n:m_n -= M;RE *TH;}TE CE Mod& Mod::OP-=(CO Mod& n)NE{m_n < n.m_n?(m_n += M)-= n.m_n:m_n -= n.m_n;RE *TH;}TE CE Mod& Mod::OP*=(CO Mod& n)NE{m_n = MO(ull(m_n)* n.m_n)% M;RE *TH;}TE <> CE MP& MP::OP*=(CO MP& n)NE{ull m_n_copy = m_n;m_n = MO((m_n_copy *= n.m_n)< P?m_n_copy:ResidueP(m_n_copy));RE *TH;}TE IN Mod& Mod::OP/=(Mod n){RE OP*=(n.Invert());}TE CE Mod& Mod::PPW(ll EX)NE{Mod pw{*TH};EX--;WH(EX != 0){(EX & 1)== 1?*TH *= pw:*TH;EX >>= 1;pw *= pw;}RE *TH;}TE CE Mod& Mod::NNPW(ll EX)NE{RE EX == 0?(m_n = 1,*TH):PPW(MO(EX));}TE CE Mod& Mod::OP^=(ll EX){if(EX < 0){m_n = ModularInverse(M,MO(m_n));EX *= -1;}RE NNPW(MO(EX));}TE CE Mod& Mod::OP<<=(ll n){RE *TH *=(n < 0 && -n < int(COants::g_memory_le))?TwoPowerInverse(- int(n)):(n >= 0 && n < int(COants::g_memory_le))?TwoPower(int(n)):Mod(2)^= MO(n);}TE CE Mod& Mod::OP>>=(ll n){RE *TH <<= MO(n *= -1);}TE CE Mod& Mod::OP++()NE{m_n < COants::g_Mm?++m_n:m_n = 0;RE *TH;}TE CE Mod Mod::OP++(int)NE{Mod n{*TH};OP++();RE n;}TE CE Mod& Mod::OP--()NE{m_n == 0?m_n = COants::g_Mm:--m_n;RE *TH;}TE CE Mod Mod::OP--(int)NE{Mod n{*TH};OP--();RE n;}DF_OF_CM_FOR_MOD(==);DF_OF_CM_FOR_MOD(!=);DF_OF_CM_FOR_MOD(>);DF_OF_CM_FOR_MOD(>=);DF_OF_CM_FOR_MOD(<);DF_OF_CM_FOR_MOD(<=);DF_OF_AR_FOR_MOD(+,NE,n,+);DF_OF_AR_FOR_MOD(-,NE,n.SignInvert(),+);DF_OF_AR_FOR_MOD(*,NE,n,*);DF_OF_AR_FOR_MOD(/,,n.Invert(),*);TE CE Mod Mod::OP^(ll EX)CO{RE MO(Mod(*TH)^= MO(EX));}TE CE Mod Mod::OP<<(ll n)CO{RE MO(Mod(*TH)<<= MO(n));}TE CE Mod Mod::OP>>(ll n)CO{RE MO(Mod(*TH)>>= MO(n));}TE CE Mod Mod::OP-()CO NE{RE MO(Mod(*TH).SignInvert());}TE CE Mod& Mod::SignInvert()NE{m_n > 0?m_n = M - m_n:m_n;RE *TH;}TE IN Mod& Mod::Invert(){m_n = m_n < COants::g_memory_le?Inverse(int(m_n)).m_n:ModularInverse(M,MO(m_n));RE *TH;}TE CE VO Mod::swap(Mod& n)NE{std::swap(m_n,n.m_n);}TE IN CO Mod& Mod::Inverse(CRI n){AS(0 < n && n < int(COants::g_memory_le));ST VE> memory ={zero(),one()};ST int le_curr = 2;WH(le_curr <= n){memory.push_back(DeRP(M - memory[M % le_curr].m_n * ull(M / le_curr)% M));le_curr++;}RE memory[n];}TE IN CO Mod& Mod::TwoPower(CRI n){AS(0 <= n && n < int(COants::g_memory_le));ST VE> memory ={one()};ST int le_curr = 1;WH(le_curr <= n){memory.push_back(memory.back()+ memory.back());le_curr++;}RE memory[n];}TE IN CO Mod& Mod::TwoPowerInverse(CRI n){AS(0 <= n && n < int(COants::g_memory_le));ST VE> memory ={one()};ST int le_curr = 1;WH(le_curr <= n){auto& m = memory.back().m_n;memory.push_back(DeRP(((m & 1)== 0?m:m + M)>> 1));le_curr++;}RE memory[n];}TE IN CO Mod& Mod::Factorial(CRL n){AS(n >= 0);if(ll(M)<= n){RE zero();}ST VE> memory ={one(),one()};ST int le_curr = 2;WH(le_curr <= n){memory.push_back(memory[le_curr - 1]* le_curr);le_curr++;}RE memory[n];}TE IN CO Mod& Mod::FactorialInverse(CRL n){AS(0 <= n && n < ll(M));ST VE> memory ={one(),one()};ST int le_curr = 2;WH(le_curr <= n){memory.push_back(memory[le_curr - 1]* Inverse(le_curr));le_curr++;}RE memory[n];}TE IN Mod Mod::Combination(CRL n,CRL i){RE 0 <= i && i <= n?Factorial(n)* FactorialInverse(i)* FactorialInverse(n - i):zero();}TE CE CRUI Mod::RP()CO NE{RE m_n;}TE CE Mod Mod::DeRP(uint n)NE{Mod n_copy{};n_copy.m_n = MO(n);RE n_copy;}TE IN CO Mod& Mod::zero()NE{ST CE CO Mod z{};RE z;}TE IN CO Mod& Mod::one()NE{ST CE CO Mod o{1};RE o;}TE CE uint Mod::GetModulo()NE{RE M;}TE IN Mod Inverse(CO Mod& n){RE MO(Mod(n).Invert());}TE CE Mod Power(Mod n,ll EX){RE MO(n ^= MO(EX));}TE CE VO swap(Mod& n0,Mod& n1)NE{n0.swap(n1);}TE IN string to_string(CO Mod& n)NE{RE to_string(n.RP())+ " + " + to_string(M)+ "Z";}TE IN IS& OP>>(IS& is,Mod& n){ll m;is >> m;n = m;RE is;}TE IN OS& OP<<(OS& os,CO Mod& n){RE os << n.RP();} US MP = Mod

; // AAA 常設ライブラリは以上に挿入する。 #define INCLUDE_LIBRARY #include __FILE__ #endif // INCLUDE_LIBRARY #endif // INCLUDE_SUB #endif // INCLUDE_MAIN