結果
| 問題 | No.2583 Differential Equation (Enhanced version) |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-10-29 09:21:22 |
| 言語 | C++17(gcc12) (gcc 12.4.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 9,487 ms / 10,000 ms |
| + 547µs | |
| コード長 | 35,362 bytes |
| 記録 | |
| コンパイル時間 | 4,718 ms |
| コンパイル使用メモリ | 297,376 KB |
| 実行使用メモリ | 48,460 KB |
| 最終ジャッジ日時 | 2026-10-29 09:23:09 |
| 合計ジャッジ時間 | 105,695 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
#ifdef INCLUDE_MAIN
ATT inline void Solve()
{
CIN( int , N , M );
if( N == 0 ){
RETURN( "0 1" );
}
const MP& zero = PO<MP>::c_zero();
const MP& one = PO<MP>::c_one();
const MP two = one + one;
FPS<MP> x{ 3 * N + 2 , PO<MP>( 1 , one ) };
FPS<MP> R{ 3 * N + 1 };
FOR( i , 0 , M ){
cin >> R[i];
}
R /= x * x - one;
R = Integral( R );
FPS<MP> eR{ Exp( R ) };
FPS<MP> 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<MP,Mod<P>> );
TE <TY INT> CE INT Log(INT N){INT AN = 0,pw = 1;WH(N > pw){pw <<= 1;AN++;}RE AN;}
TE <TY T,int EX_lim>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 <TY T,int EX_lim> CE Power3Power_CE<T,EX_lim>::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 <TY T,int EX_lim> CE CO T& Power3Power_CE<T,EX_lim>::OP[](CRI i)CO{AS(i < EX_lim);RE m_val[i];}TE <TY T,int EX_lim> CE CO T(&Power3Power_CE<T,EX_lim>::Get()CO)[EX_lim]{RE m_val;}
// PO
#define DC_OF_AR_FOR_PO(FUNC)IN PO<T> OP FUNC(PO<T> f)CO;IN PO<T> OP FUNC(T t)CO
#define DF_OF_AR_FOR_PO(FUNC,DEF)TE <TY T> IN PO<T> PO<T>::OP FUNC(PO<T> f)CO{RE MO(DEF);};TE <TY T> IN PO<T> PO<T>::OP FUNC(T t)CO{RE *TH FUNC PO<T>(MO(t));}
TE <TY T>CL PO{PU:VE<T> m_f;int m_SZ;IN PO();IN PO(CO PO<T>& f);IN PO(PO<T>&& f);IN PO(VE<T> f);IN PO(T t);IN PO(CRI i,T t);IN PO<T>& OP=(T n);IN PO<T>& OP=(PO<T> f);IN PO<T>& OP=(VE<T> f);IN CO T& OP[](CRI i)CO;IN T& OP[](CRI i);T OP()(CO T& t)CO;PO<T>& OP+=(CO PO<T>& f);PO<T>& OP-=(CO PO<T>& f);PO<T>& OP*=(PO<T> f);IN PO<T>& OP/=(CO PO<T>& f);PO<T>& OP/=(CO T& t);PO<T>& OP%=(CO PO<T>& f);PO<T>& OP%=(CO T& t);bool OP==(CO PO<T>& f)CO;bool OP==(CO T& t)CO;TE <TY P> IN bool OP!=(CO P& f)CO;DC_OF_AR_FOR_PO(+);IN PO<T> OP-()CO;DC_OF_AR_FOR_PO(-);DC_OF_AR_FOR_PO(*);IN PO<T> OP/(CO PO<T>& f)CO;IN PO<T> OP/(CO T& t)CO;IN PO<T> OP%(CO PO<T>& f)CO;IN PO<T> OP%(CO T& t)CO;IN CO VE<T>& GetCoefficient()CO NE;IN CRI SZ()CO NE;IN VO resize(CRI deg_plus)NE;int Valuation()CO NE;IN VO swap(PO<T>& f);IN VO swap(VE<T>& f);VO Reduce();VO TP(CRI N_trunc);ST PO<T> NaiveCN(PO<T> f0,CRI valuation0,CO PO<T>& f1,CRI valuation1,CRI N_trunc);ST PO<T> NaiveQuotient(PO<T> f0,CO PO<T>& f1);ST PO<T> NaiveResidue(PO<T> f0,CO PO<T>& f1);ST IN CO PO<T>& zero();ST IN CO PO<T>& one();ST IN CO PO<T>& x();ST IN CO T& c_zero();ST IN CO T& c_one();ST IN CO T& c_minus_one();IN PO<T>& SignInvert();};
// FPS
TE <TY T>CL FPS:PU PO<T>{PU:int m_N;IN FPS(CRI N = 0);IN FPS(CO FPS<T>& f);IN FPS(FPS<T>&& f);IN FPS(CRI N,T t);IN FPS(CRI N,CO PO<T>& f);IN FPS(CRI N,PO<T>&& f);IN FPS(CRI N,VE<T>&& f);IN FPS(CRI N,CRI i,T t);IN FPS<T>& OP=(FPS<T> f);IN FPS<T>& OP=(T n);IN FPS<T>& OP=(PO<T> f);IN FPS<T>& OP+=(CO T& t);FPS<T>& OP+=(CO PO<T>& f);IN FPS<T>& OP+=(CO FPS<T>& f);IN FPS<T>& OP-=(CO T& t);FPS<T>& OP-=(CO PO<T>& f);IN FPS<T>& OP-=(CO FPS<T>& f);IN FPS<T>& OP*=(CO T& t);FPS<T>& OP*=(PO<T> f);IN FPS<T>& OP*=(FPS<T> f);IN FPS<T>& OP/=(CO T& t);IN FPS<T>& OP/=(CO FPS<T>& t);TE <TY P> IN FPS<T> OP+(CO P& f)CO;IN FPS<T> OP-()CO;TE <TY P> IN FPS<T> OP-(CO P& f)CO;TE <TY P> IN FPS<T> OP*(CO P& f)CO;TE <TY P> IN FPS<T> OP/(CO P& f)CO;FPS<T> Inverse()CO;IN VO SetTruncation(CRI N)NE;IN CRI GetTruncation()CO NE;IN FPS<T>& TruncateInitial(CRI N)NE;IN FPS<T>& TruncateFinal(CRI N)NE;};
TE <TY T>US FPS = FPS<T>;
// 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<TYPE> = LE - 1;TE <> IN CO TYPE(&PrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT<TYPE>]{ST CE Power3Power_CE<TYPE,LimitOfPowerForFFT<TYPE>> PRT{PR};ST_AS(PRT.m_val[0]== TYPE::DeRP(1));RE PRT.Get();}TE <> IN CO TYPE(&InversePrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT<TYPE>]{ST CE Power3Power_CE<TYPE,LimitOfPowerForFFT<TYPE>> 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<TYPE>& PO<TYPE>::OP*=(PO<TYPE> f){CO int SZ = m_SZ + f.m_SZ - 1;RE *TH = FFTCN(MO(*TH),MO(f),SZ);}TE <> IN PO<TYPE>& PO<TYPE>::OP/=(CO PO<TYPE>& f){RE *TH = FFTQuotient(*TH,f);}TE <> IN PO<TYPE>& PO<TYPE>::OP%=(CO PO<TYPE>& f){RE *TH = FFTResidue(*TH,f);}
#define PS_FOR_FFT(MOD,LE,PR,IPR,MINT)PS_FOR_FFT_BODY(MOD,LE,PR,IPR,MINT<MOD>)
TE <TY T> CE CO int LimitOfPowerForFFT;TE <TY T> IN CO T(&PrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT<T>];TE <TY T> IN CO T(&InversePrimitiveRootOfTwoForFFT()NE)[LimitOfPowerForFFT<T>];
TE <TY T>VO CooleyTukey(VE<T>& f,CRI N_shift,CRI N_input_start,CRI N_input_lim,CRI N_trunc,CRI two_pw,CRI EX,CO T(&PRT)[LimitOfPowerForFFT<T>]){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);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<int> bit_reverse[32]={VE<int>(1)};ST int e_next = 1;ST int two_pw_next = 1;ST int two_pw_next2 = 2;ST VE<int>* p_bit_reverse_prev = bit_reverse;ST VE<int>* p_bit_reverse_curr = p_bit_reverse_prev + 1;WH(e_next <= EX){*p_bit_reverse_curr = VE<int>(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<int>& 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 <TY T> IN VO FFT(VE<T>& f,CRI N_input_start,CRI N_input_lim,CRI two_pw,CRI EX){CooleyTukey<T>(f,0,N_input_start,N_input_lim,N_input_start + two_pw,two_pw,EX,PrimitiveRootOfTwoForFFT<T>());}TE <TY T> IN VO IFFT(VE<T>& 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<T>(f,N_shift,N_input_start,N_input_lim,N_trunc,two_pw,EX,InversePrimitiveRootOfTwoForFFT<T>());CO int SZ = f.SZ();for(int i = N_shift + N_input_start;i < SZ;i++){f[i]*= two_pw_inv;}}TE <TY T>PO<T> FFTCN(PO<T> f0,PO<T> f1,CRI N_trunc){if(f0.m_SZ > N_trunc){f0.m_f.resize(f0.m_SZ = N_trunc);}f0.Reduce();if(f0.m_SZ == 0){RE MO(f0);}if(f1.m_SZ > N_trunc){f1.m_f.resize(f1.m_SZ = N_trunc);}f1.Reduce();if(f1.m_SZ == 0){RE MO(f1);}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 <TY T>PO<T> FFTQuotient(PO<T>& f0,PO<T> f1){f0.Reduce();f1.Reduce();AS(f1.m_SZ > 0);if(f0.m_SZ < f1.m_SZ){RE PO<T>::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<T> f1_TP_inverse = FPS<T>(f0_TP_SZ,MO(f1)).Inverse();f0.TP(f0_TP_SZ);FPS<T> f0_TP{f0_TP_SZ,MO(f0)};f0_TP *= f1_TP_inverse;f0_TP.TP(f0_TP_SZ);RE f0_TP;}TE <TY T>PO<T> FFTResidue(PO<T>& f0,PO<T> 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 <TY T> IN FPS<T>::FPS(CRI N):PO<T>(),m_N(N){}TE <TY T> IN FPS<T>::FPS(CO FPS<T>& f):PO<T>(f),m_N(f.m_N){}TE <TY T> IN FPS<T>::FPS(FPS<T>&& f):PO<T>(MO(f.m_f)),m_N(f.m_N){}TE <TY T> IN FPS<T>::FPS(CRI N,T t):PO<T>(MO(t)),m_N(N){AS(m_N > 0);}TE <TY T> IN FPS<T>::FPS(CRI N,CO PO<T>& f):PO<T>(),m_N(N){AS(m_N > 0);TH->m_SZ = f.m_SZ < m_N?f.m_SZ:m_N;TH->m_f = VE<T>(TH->m_SZ);for(int i = 0;i < TH->m_SZ;i++){TH->m_f[i]= f.m_f[i];}}TE <TY T> IN FPS<T>::FPS(CRI N,PO<T>&& f):PO<T>(),m_N(N){if(f.m_SZ < m_N * 2){PO<T>::OP=(MO(f));if(f.m_SZ > m_N){TruncateFinal(m_N);}}else{TH->m_f = VE<T>(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 <TY T> IN FPS<T>::FPS(CRI N,VE<T>&& f):PO<T>(),m_N(N){AS(m_N > 0);CO int f_SZ = f.SZ();if(f_SZ < m_N * 2){PO<T>::OP=(MO(f));if(f_SZ > m_N){TruncateFinal(m_N);}}else{TH->m_f = VE<T>(m_N);for(int i = 0;i < m_N;i++){TH->m_f[i]= MO(f[i]);}}}TE <TY T> IN FPS<T>::FPS(CRI N,CRI i,T t):PO<T>(),m_N(N){AS(m_N > 0);if(i < m_N?t != TH->c_zero():false){(*TH)[i]= MO(t);}}TE <TY T> IN FPS<T>& FPS<T>::OP=(FPS<T> f){PO<T>::OP=(MO(f.m_f));m_N = f.m_N;RE *TH;}TE <TY T> IN FPS<T>& FPS<T>::OP=(T n){PO<T>::OP=(MO(n));RE *TH;}TE <TY T> IN FPS<T>& FPS<T>::OP=(PO<T> f){RE OP=(FPS<T>(m_N,MO(f)));}TE <TY T> IN FPS<T>& FPS<T>::OP+=(CO T& t){PO<T>::OP+=(t);RE *TH;}TE <TY T>FPS<T>& FPS<T>::OP+=(CO PO<T>& 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 <TY T> IN FPS<T>& FPS<T>::OP+=(CO FPS<T>& f){AS(m_N <= f.m_N);CO PO<T>& f_ref = f;RE OP+=(f_ref);}TE <TY T> IN FPS<T>& FPS<T>::OP-=(CO T& t){PO<T>::OP-=(t);RE *TH;}TE <TY T>FPS<T>& FPS<T>::OP-=(CO PO<T>& 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 <TY T> IN FPS<T>& FPS<T>::OP-=(CO FPS<T>& f){AS(m_N <= f.m_N);CO PO<T>& f_ref = f;RE OP-=(f_ref);}TE <TY T> IN FPS<T>& FPS<T>::OP*=(CO T& t){PO<T>::OP*=(t);RE *TH;}TE <TY T>FPS<T>& FPS<T>::OP*=(PO<T> f){*TH = FFTCN(forward<PO<T>>(*TH),MO(f),m_N);RE *TH;}TE <TY T> IN FPS<T>& FPS<T>::OP*=(FPS<T> f){AS(m_N <= f.m_N);RE OP*=(forward<PO<T>>(f));}TE <TY T> IN FPS<T>& FPS<T>::OP/=(CO T& t){PO<T>::OP/=(t);RE *TH;}TE <TY T> IN FPS<T>& FPS<T>::OP/=(CO FPS<T>& f){AS(m_N <= f.m_N);RE OP*=(m_N == f.m_N?f.Inverse():FPS<T>(m_N,f).Inverse());}TE <TY T> TE <TY P> IN FPS<T> FPS<T>::OP+(CO P& f)CO{RE MO(FPS<T>(*TH)+= f);}TE <TY T> IN FPS<T> FPS<T>::OP-()CO{RE MO(FPS<T>(m_N)-= *TH);}TE <TY T> TE <TY P> IN FPS<T> FPS<T>::OP-(CO P& f)CO{RE MO(FPS<T>(*TH)-= f);}TE <TY T> TE <TY P> IN FPS<T> FPS<T>::OP*(CO P& f)CO{RE MO(FPS<T>(*TH)*= f);}TE <TY T> TE <TY P> IN FPS<T> FPS<T>::OP/(CO P& f)CO{RE MO(FPS<T>(*TH)/= f);}TE <TY T>FPS<T> FPS<T>::Inverse()CO{AS(TH->m_SZ > 0 && TH->m_f[0]!= TH->c_zero());CO PO<T>& TH_ref = *TH;int pw;int pw_2 = 1;FPS<T> 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 <TY T> IN VO FPS<T>::SetTruncation(CRI N)NE{if(N < m_N){TruncateFinal(N);}m_N = N;}TE <TY T> IN CRI FPS<T>::GetTruncation()CO NE{RE m_N;}TE <TY T> IN FPS<T>& FPS<T>::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 <TY T> IN FPS<T>& FPS<T>::TruncateFinal(CRI N)NE{WH(TH->m_SZ > N){TH->m_f.pop_back();TH->m_SZ--;}RE *TH;}TE <TY T>FPS<T> Differential(CO FPS<T>& f){auto& SZ = f.SZ();auto& N = f.GetTruncation();if(SZ < 1){RE FPS<T>(1 < N?N - 1:1);}VE<T> df(SZ - 1);for(int i = 1;i < SZ;i++){df[i - 1]= f[i]* i;}RE FPS<T>(1 < N?N - 1:1,MO(df));}TE <TY T>FPS<T> Differential(CRI n,CO FPS<T>& f){if(n == 0){RE f;}if(n == 1){RE Differential<T>(f);}auto& SZ = f.SZ();auto& N = f.GetTruncation();if(SZ < n){RE FPS<T>(n < N?N - n:1);}VE<T> 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<T>(n < N?N - n:1,MO(df));}TE <TY T>FPS<T> ShiftedIntegral(CRI n,CO FPS<T>& f,CRI shift){auto& SZ = f.SZ();auto& N = f.GetTruncation();if(SZ + n < shift){RE FPS<T>{N + n > shift?N + n - shift:1};}VE<T> 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<T>(N + n - shift,MO(F));}TE <TY T> IN FPS<T> Integral(CO FPS<T>& f){RE ShiftedIntegral<T>(1,f,0);}TE <TY T> IN FPS<T> Integral(CRI n,CO FPS<T>& f){RE ShiftedIntegral<T>(n,f,0);}TE <TY T>FPS<T> Exp(CO FPS<T>& f){AS(f[0]== f.c_zero());CRI N = f.GetTruncation();int pw;int pw_2 = 1;FPS<T> 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<T>(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 <TY T> IN FPS<T> Log(CO FPS<T>& f){AS(f[0]== f.c_one());RE Integral<T>(Differential<T>(f)/= f);}TE <TY T,CL Traits> IN OS& OP<<(OS& os,CO FPS<T>& f){CO int N = f.GetTruncation();for(int i = 0;i < N;i++){(i > 0?os << " ":os)<< f[i];}RE os;}
// PO
TE <TY T> IN PO<T>::PO():m_f(),m_SZ(0){}TE <TY T> IN PO<T>::PO(CO PO<T>& f):m_f(f.m_f),m_SZ(f.m_SZ){}TE <TY T> IN PO<T>::PO(PO<T>&& f):m_f(MO(f.m_f)),m_SZ(f.m_SZ){}TE <TY T> IN PO<T>::PO(VE<T> f):m_f(MO(f)),m_SZ(m_f.SZ()){}TE <TY T> IN PO<T>::PO(T t):PO(){if(t != c_zero()){OP[](0)= MO(t);}}TE <TY T> IN PO<T>::PO(CRI i,T t):PO(){if(t != c_zero()){OP[](i)= MO(t);}}TE <TY T> IN PO<T>& PO<T>::OP=(T n){m_f.clear();m_SZ = 0;OP[](0)= MO(n);RE *TH;}TE <TY T> IN PO<T>& PO<T>::OP=(PO<T> f){m_f = MO(f.m_f);m_SZ = f.m_SZ;RE *TH;}TE <TY T> IN PO<T>& PO<T>::OP=(VE<T> f){m_f = MO(f);m_SZ = m_f.SZ();RE *TH;}TE <TY T> IN CO T& PO<T>::OP[](CRI i)CO{RE m_SZ <= i?c_zero():m_f[i];}TE <TY T> IN T& PO<T>::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 <TY T> T PO<T>::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 <TY T>PO<T>& PO<T>::OP+=(CO PO<T>& 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 <TY T>PO<T>& PO<T>::OP-=(CO PO<T>& 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 <TY T>PO<T>& PO<T>::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 <TY T>PO<T>& PO<T>::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 <TY T>bool PO<T>::OP==(CO PO<T>& 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 <TY T>bool PO<T>::OP==(CO T& t)CO{CRI SZ_max = SZ();CO T& zero = PO<T>::c_zero();for(int i = 1;i < SZ_max;i++){if(m_f[i]!= zero){RE false;}}RE OP[](0)== t;}TE <TY T> TE<TY P> IN bool PO<T>::OP!=(CO P& f)CO{RE !(*TH == f);}DF_OF_AR_FOR_PO(+,f += *TH);TE <TY T> IN PO<T>& PO<T>::SignInvert(){Reduce();for(auto& fi:m_f){fi = -fi;}RE *TH;}TE <TY T> IN PO<T> PO<T>::OP-()CO{RE MO(PO<T>(*TH).SignInvert());}DF_OF_AR_FOR_PO(-,f.SignInvert()+= *TH);DF_OF_AR_FOR_PO(*,f *= *TH);TE <TY T> IN PO<T> PO<T>::OP/(CO T& t)CO{RE MO(PO<T>(*TH)/= t);}TE <TY T> IN PO<T> PO<T>::OP/(CO PO<T>& f)CO{RE MO(PO<T>(*TH)/= f);}TE <TY T> IN PO<T> PO<T>::OP%(CO T& t)CO{RE MO(PO<T>(*TH)%= t);}TE <TY T> IN PO<T> PO<T>::OP%(CO PO<T>& f)CO{RE MO(PO<T>(*TH)%= f);}TE <TY T> IN CO VE<T>& PO<T>::GetCoefficient()CO NE{RE m_f;}TE <TY T> IN CRI PO<T>::SZ()CO NE{RE m_SZ;}TE <TY T> IN VO PO<T>::resize(CRI deg_plus)NE{m_f.resize(m_SZ = deg_plus);}TE <TY T>int PO<T>::Valuation()CO NE{for(int i = 0;i < m_SZ;i++){if(m_f[i]!= c_zero()){RE i;}}RE -1;}TE <TY T> IN VO PO<T>::swap(PO<T>& f){m_f.swap(f.m_f);swap(m_SZ,f.m_SZ);}TE <TY T> IN VO PO<T>::swap(VE<T>& f){m_f.swap(f);m_SZ = m_f.SZ();}TE <TY T>VO PO<T>::Reduce(){CO T& z = c_zero();WH(m_SZ > 0 && m_f[m_SZ - 1]== z){m_f.pop_back();m_SZ--;}RE;}TE <TY T>VO PO<T>::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 <TY T> IN CO PO<T>& PO<T>::zero(){ST CO PO<T> z{};RE z;}TE <TY T> IN CO PO<T>& PO<T>::one(){ST CO PO<T> o{c_one()};RE o;}TE <TY T> IN CO PO<T>& PO<T>::x(){ST CO PO<T> f{1,c_one()};RE f;}TE <TY T> IN CO T& PO<T>::c_zero(){ST CO T z{0};RE z;}TE <TY T> IN CO T& PO<T>::c_one(){ST CO T o{1};RE o;}TE <TY T> IN CO T& PO<T>::c_minus_one(){ST CO T m{-1};RE m;}TE <TY T>PO<T> Differential(CRI n,CO PO<T>& f){CRI SZ = f.SZ();if(SZ < n){RE PO<T>::zero();}VE<T> 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<T>(MO(df));}TE <TY T> IN PO<T> Differential(CO PO<T>& f){RE Differential(1,f);}
TE <TY T>PO<T> PO<T>::NaiveCN(PO<T> f0,CRI valuation0,CO PO<T>& 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 <TY T,CL Traits> IN OS& OP<<(OS& os,CO PO<T>& 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 T,TE <TY...> TY V> FPS<T>& Prod(V<FPS<T>>& f){DF_OF_PROD(Prod(f),FPS<T>(1,PO<T>::one()),t *= *IT);}
// Tに拡張された冪乗のN次打ち切り。
TE <TY T> IN FPS<T> Power(CO FPS<T>& f,CO T& t){RE Exp(Log(f)*= t);}
// 冪乗のN次打ち切り。
TE <TY T , TY INT> FPS<T> Power(CO FPS<T>& f,CO INT& e){CO T& one = PO<T>::c_one();if(f[0] == one){RE Power(f,T(e));}CO T& zero = PO<T>::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<T>(N);}FPS<T> 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 <TY T>VO Shift(PO<T>& f,CO T& t,CO bool& EXial = false){f.Reduce();CRI SZ = f.SZ();if(SZ > 0 && t != f.c_zero()){FPS<T> 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 <TY T>VO AffineTransformation(PO<T>& 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 <TY T>FPS<T> MoeviusComposition(CRI N,PO<T> f,T a,T b,T c,T d){CO T& zero = PO<T>::c_zero();CO T& one = PO<T>::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);CO int SZ = f.SZ();if(SZ > 0){f.TP(SZ);AffineTransformation(f,c,d);FPS<T> g{N};g[0]= MO(d);g[1]= MO(c);f = FPS<T>{N,MO(f)}/= Power(g,SZ - 1);}}}RE FPS<T>(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<LL> A( N ); SET_A( A , N );
#endif
#include <bits/stdc++.h>
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<decltype( VAR )>
#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 <class Traits> inline basic_istream<char,Traits>& VariadicCin( basic_istream<char,Traits>& is ) { return is; }
template <class Traits , typename Arg , typename... ARGS> inline basic_istream<char,Traits>& VariadicCin( basic_istream<char,Traits>& is , Arg& arg , ARGS&... args ) { return VariadicCin( is >> arg , args... ); }
template <class Traits> inline basic_istream<char,Traits>& VariadicGetline( basic_istream<char,Traits>& is , const char& separator ) { return is; }
template <class Traits , typename Arg , typename... ARGS> inline basic_istream<char,Traits>& VariadicGetline( basic_istream<char,Traits>& is , const char& separator , Arg& arg , ARGS&... args ) { return VariadicGetline( getline( is , arg , separator ) , separator , args... ); }
template <class Traits , typename Arg> inline basic_ostream<char,Traits>& VariadicCout( basic_ostream<char,Traits>& os , const Arg& arg ) { return os << arg; }
template <class Traits , typename Arg1 , typename Arg2 , typename... ARGS> inline basic_ostream<char,Traits>& VariadicCout( basic_ostream<char,Traits>& 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<char,Traits>
#define OS basic_ostream<char,Traits>
#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 <uint M,TY INT> CE INT Residue(INT n)NE{RE MO(n < 0?((((++n)*= -1)%= M)*= -1)+= M - 1:n < INT(M)?n:n %= M);}TE <TY INT> 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 <TY INT> 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 <uint M> CL Mod;TE <uint M>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<is_COructible_v<uint,decay_t<T>>>*
#define DC_OF_CM_FOR_MOD(OPR)CE bool OP OPR(CO Mod<M>& n)CO NE
#define DC_OF_AR_FOR_MOD(OPR,EX)CE Mod<M> OP OPR(Mod<M> n)CO EX
#define DF_OF_CM_FOR_MOD(OPR)TE <uint M> CE bool Mod<M>::OP OPR(CO Mod<M>& n)CO NE{RE m_n OPR n.m_n;}
#define DF_OF_AR_FOR_MOD(OPR,EX,LEFT,OPR2)TE <uint M> CE Mod<M> Mod<M>::OP OPR(Mod<M> n)CO EX{RE MO(LEFT OPR2 ## = *TH);}TE <uint M,TY T,SFINAE_FOR_MOD = nullptr> CE Mod<M> OP OPR(T n0,CO Mod<M>& n1)EX{RE MO(Mod<M>(MO(n0))OPR ## = n1);}
TE <uint M>CL Mod{PU:uint m_n;CE Mod()NE;CE Mod(CO Mod<M>& n)NE;CE Mod(Mod<M>&& n)NE;TE <TY T,SFINAE_FOR_MOD = nullptr> CE Mod(T n)NE;CE Mod<M>& OP=(Mod<M> n)NE;CE Mod<M>& OP+=(CO Mod<M>& n)NE;CE Mod<M>& OP-=(CO Mod<M>& n)NE;CE Mod<M>& OP*=(CO Mod<M>& n)NE;IN Mod<M>& OP/=(Mod<M> n);CE Mod<M>& OP^=(ll EX);CE Mod<M>& OP<<=(ll n);CE Mod<M>& OP>>=(ll n);CE Mod<M>& OP++()NE;CE Mod<M> OP++(int)NE;CE Mod<M>& OP--()NE;CE Mod<M> 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<M> OP^(ll EX)CO;CE Mod<M> OP<<(ll n)CO;CE Mod<M> OP>>(ll n)CO;CE Mod<M> OP-()CO NE;CE VO swap(Mod<M>& n)NE;CE CRUI RP()CO NE;ST CE Mod<M> DeRP(uint n)NE;ST IN CO Mod<M>& Factorial(CRL n);ST IN CO Mod<M>& FactorialInverse(CRL n);ST IN Mod<M> Combination(CRL n,CRL i);ST IN CO Mod<M>& zero()NE;ST IN CO Mod<M>& one()NE;ST CE uint GetModulo()NE;CE Mod<M>& SignInvert()NE;IN Mod<M>& Invert();CE Mod<M>& PPW(ll EX)NE;CE Mod<M>& NNPW(ll EX)NE;ST IN CO Mod<M>& Inverse(CRI n);ST IN CO Mod<M>& TwoPower(CRI n);ST IN CO Mod<M>& TwoPowerInverse(CRI n);US COants = COantsForMod<M>;};
US MP = Mod<P>;
TE <uint M> CE Mod<M>::Mod()NE:m_n(){}TE <uint M> CE Mod<M>::Mod(CO Mod<M>& n)NE:m_n(n.m_n){}TE <uint M> CE Mod<M>::Mod(Mod<M>&& n)NE:m_n(MO(n.m_n)){}TE <uint M> TE <TY T,SFINAE_FOR_MOD> CE Mod<M>::Mod(T n)NE:m_n(Residue<M>(MO(n))){}TE <uint M> CE Mod<M>& Mod<M>::OP=(Mod<M> n)NE{m_n = MO(n.m_n);RE *TH;}TE <uint M> CE Mod<M>& Mod<M>::OP+=(CO Mod<M>& n)NE{(m_n += n.m_n)< M?m_n:m_n -= M;RE *TH;}TE <uint M> CE Mod<M>& Mod<M>::OP-=(CO Mod<M>& n)NE{m_n < n.m_n?(m_n += M)-= n.m_n:m_n -= n.m_n;RE *TH;}TE <uint M> CE Mod<M>& Mod<M>::OP*=(CO Mod<M>& 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 <uint M> IN Mod<M>& Mod<M>::OP/=(Mod<M> n){RE OP*=(n.Invert());}TE <uint M> CE Mod<M>& Mod<M>::PPW(ll EX)NE{Mod<M> pw{*TH};EX--;WH(EX != 0){(EX & 1)== 1?*TH *= pw:*TH;EX >>= 1;pw *= pw;}RE *TH;}TE <uint M> CE Mod<M>& Mod<M>::NNPW(ll EX)NE{RE EX == 0?(m_n = 1,*TH):PPW(MO(EX));}TE <uint M> CE Mod<M>& Mod<M>::OP^=(ll EX){if(EX < 0){m_n = ModularInverse(M,MO(m_n));EX *= -1;}RE NNPW(MO(EX));}TE <uint M> CE Mod<M>& Mod<M>::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<M>(2)^= MO(n);}TE <uint M> CE Mod<M>& Mod<M>::OP>>=(ll n){RE *TH <<= MO(n *= -1);}TE <uint M> CE Mod<M>& Mod<M>::OP++()NE{m_n < COants::g_Mm?++m_n:m_n = 0;RE *TH;}TE <uint M> CE Mod<M> Mod<M>::OP++(int)NE{Mod<M> n{*TH};OP++();RE n;}TE <uint M> CE Mod<M>& Mod<M>::OP--()NE{m_n == 0?m_n = COants::g_Mm:--m_n;RE *TH;}TE <uint M> CE Mod<M> Mod<M>::OP--(int)NE{Mod<M> 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 <uint M> CE Mod<M> Mod<M>::OP^(ll EX)CO{RE MO(Mod<M>(*TH)^= MO(EX));}TE <uint M> CE Mod<M> Mod<M>::OP<<(ll n)CO{RE MO(Mod<M>(*TH)<<= MO(n));}TE <uint M> CE Mod<M> Mod<M>::OP>>(ll n)CO{RE MO(Mod<M>(*TH)>>= MO(n));}TE <uint M> CE Mod<M> Mod<M>::OP-()CO NE{RE MO(Mod<M>(*TH).SignInvert());}TE <uint M> CE Mod<M>& Mod<M>::SignInvert()NE{m_n > 0?m_n = M - m_n:m_n;RE *TH;}TE <uint M> IN Mod<M>& Mod<M>::Invert(){m_n = m_n < COants::g_memory_le?Inverse(int(m_n)).m_n:ModularInverse(M,MO(m_n));RE *TH;}TE <uint M> CE VO Mod<M>::swap(Mod<M>& n)NE{std::swap(m_n,n.m_n);}TE <uint M> IN CO Mod<M>& Mod<M>::Inverse(CRI n){AS(0 < n && n < int(COants::g_memory_le));ST VE<Mod<M>> 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 <uint M> IN CO Mod<M>& Mod<M>::TwoPower(CRI n){AS(0 <= n && n < int(COants::g_memory_le));ST VE<Mod<M>> memory ={one()};ST int le_curr = 1;WH(le_curr <= n){memory.push_back(memory.back()+ memory.back());le_curr++;}RE memory[n];}TE <uint M> IN CO Mod<M>& Mod<M>::TwoPowerInverse(CRI n){AS(0 <= n && n < int(COants::g_memory_le));ST VE<Mod<M>> 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 <uint M> IN CO Mod<M>& Mod<M>::Factorial(CRL n){AS(n >= 0);if(ll(M)<= n){RE zero();}ST VE<Mod<M>> 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 <uint M> IN CO Mod<M>& Mod<M>::FactorialInverse(CRL n){AS(0 <= n && n < ll(M));ST VE<Mod<M>> 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 <uint M> IN Mod<M> Mod<M>::Combination(CRL n,CRL i){RE 0 <= i && i <= n?Factorial(n)* FactorialInverse(i)* FactorialInverse(n - i):zero();}TE <uint M> CE CRUI Mod<M>::RP()CO NE{RE m_n;}TE <uint M> CE Mod<M> Mod<M>::DeRP(uint n)NE{Mod<M> n_copy{};n_copy.m_n = MO(n);RE n_copy;}TE <uint M> IN CO Mod<M>& Mod<M>::zero()NE{ST CE CO Mod<M> z{};RE z;}TE <uint M> IN CO Mod<M>& Mod<M>::one()NE{ST CE CO Mod<M> o{1};RE o;}TE <uint M> CE uint Mod<M>::GetModulo()NE{RE M;}TE <uint M> IN Mod<M> Inverse(CO Mod<M>& n){RE MO(Mod<M>(n).Invert());}TE <uint M> CE Mod<M> Power(Mod<M> n,ll EX){RE MO(n ^= MO(EX));}TE <uint M> CE VO swap(Mod<M>& n0,Mod<M>& n1)NE{n0.swap(n1);}TE <uint M> IN string to_string(CO Mod<M>& n)NE{RE to_string(n.RP())+ " + " + to_string(M)+ "Z";}TE <uint M,CL Traits> IN IS& OP>>(IS& is,Mod<M>& n){ll m;is >> m;n = m;RE is;}TE <uint M,CL Traits> IN OS& OP<<(OS& os,CO Mod<M>& n){RE os << n.RP();}
US MP = Mod<P>;
// AAA 常設ライブラリは以上に挿入する。
#define INCLUDE_LIBRARY
#include __FILE__
#endif // INCLUDE_LIBRARY
#endif // INCLUDE_SUB
#endif // INCLUDE_MAIN