#line 1 "verify/fps/LC_montmort_number_mod.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/montmort_number_mod"
#line 2 "template/template.hpp"
#include <bits/stdc++.h>
using namespace std ;
#line 2 "template/macro.hpp"
#define rep(i, a, b) for (int i = (a); i < (int)(b); i++)
#define rrep(i, a, b) for (int i = (int)(b) - 1; i >= (a); i--)
#define ALL(v) (v).begin(), (v).end()
#define UNIQUE(v) sort(ALL(v)), (v).erase(unique(ALL(v)), (v).end())
#define SZ(v) (int)v.size()
#define MIN(v) *min_element(ALL(v))
#define MAX(v) *max_element(ALL(v))
#define LB(v, x) int(lower_bound(ALL(v), (x)) - (v).begin())
#define UB(v, x) int(upper_bound(ALL(v), (x)) - (v).begin())
#define YN(b) cout << ((b) ? "YES" : "NO") << "\n";
#define Yn(b) cout << ((b) ? "Yes" : "No") << "\n";
#define yn(b) cout << ((b) ? "yes" : "no") << "\n";
#line 6 "template/template.hpp"
#line 2 "template/util.hpp"
using uint = unsigned int ;
using ll = long long int ;
using ull = unsigned long long ;
using i128 = __int128_t ;
using u128 = __uint128_t ;
template < class T , class S = T >
S SUM ( const vector < T >& a ) {
return accumulate ( ALL ( a ), S ( 0 ));
}
template < class T >
inline bool chmin ( T & a , T b ) {
if ( a > b ) {
a = b ;
return true ;
}
return false ;
}
template < class T >
inline bool chmax ( T & a , T b ) {
if ( a < b ) {
a = b ;
return true ;
}
return false ;
}
template < class T >
int popcnt ( T x ) {
return __builtin_popcountll ( x );
}
template < class T >
int topbit ( T x ) {
return ( x == 0 ? - 1 : 63 - __builtin_clzll ( x ));
}
template < class T >
int lowbit ( T x ) {
return ( x == 0 ? - 1 : __builtin_ctzll ( x ));
}
#line 8 "template/template.hpp"
#line 2 "template/inout.hpp"
struct Fast {
Fast () {
cin . tie ( nullptr );
ios_base :: sync_with_stdio ( false );
cout << fixed << setprecision ( 15 );
}
} fast ;
template < class T1 , class T2 >
istream & operator >> ( istream & is , pair < T1 , T2 >& p ) {
return is >> p . first >> p . second ;
}
template < class T1 , class T2 >
ostream & operator << ( ostream & os , const pair < T1 , T2 >& p ) {
return os << p . first << " " << p . second ;
}
template < class T >
istream & operator >> ( istream & is , vector < T >& a ) {
for ( auto & v : a ) is >> v ;
return is ;
}
template < class T >
ostream & operator << ( ostream & os , const vector < T >& a ) {
for ( auto it = a . begin (); it != a . end ();) {
os << * it ;
if ( ++ it != a . end ()) os << " " ;
}
return os ;
}
template < class T >
ostream & operator << ( ostream & os , const set < T >& st ) {
os << "{" ;
for ( auto it = st . begin (); it != st . end ();) {
os << * it ;
if ( ++ it != st . end ()) os << "," ;
}
os << "}" ;
return os ;
}
template < class T1 , class T2 >
ostream & operator << ( ostream & os , const map < T1 , T2 >& mp ) {
os << "{" ;
for ( auto it = mp . begin (); it != mp . end ();) {
os << it -> first << ":" << it -> second ;
if ( ++ it != mp . end ()) os << "," ;
}
os << "}" ;
return os ;
}
void in () {}
template < typename T , class ... U >
void in ( T & t , U & ... u ) {
cin >> t ;
in ( u ...);
}
void out () { cout << " \n " ; }
template < typename T , class ... U , char sep = ' ' >
void out ( const T & t , const U & ... u ) {
cout << t ;
if ( sizeof ...( u )) cout << sep ;
out ( u ...);
}
#line 10 "template/template.hpp"
#line 2 "template/debug.hpp"
#ifdef LOCAL
#define debug 1
#define show(...) _show(0, #__VA_ARGS__, __VA_ARGS__)
#else
#define debug 0
#define show(...) true
#endif
template < class T >
void _show ( int i , T name ) {
cerr << '\n' ;
}
template < class T1 , class T2 , class ... T3 >
void _show ( int i , const T1 & a , const T2 & b , const T3 & ... c ) {
for (; a [ i ] != ',' && a [ i ] != '\0' ; i ++ ) cerr << a [ i ];
cerr << ":" << b << " " ;
_show ( i + 1 , a , c ...);
}
#line 2 "math/util.hpp"
namespace Math {
template < class T >
T safe_mod ( T a , T b ) {
assert ( b != 0 );
if ( b < 0 ) a = - a , b = - b ;
a %= b ;
return a >= 0 ? a : a + b ;
}
template < class T >
T floor ( T a , T b ) {
assert ( b != 0 );
if ( b < 0 ) a = - a , b = - b ;
return a >= 0 ? a / b : ( a + 1 ) / b - 1 ;
}
template < class T >
T ceil ( T a , T b ) {
assert ( b != 0 );
if ( b < 0 ) a = - a , b = - b ;
return a > 0 ? ( a - 1 ) / b + 1 : a / b ;
}
long long isqrt ( long long n ) {
if ( n <= 0 ) return 0 ;
long long x = sqrt ( n );
while (( x + 1 ) * ( x + 1 ) <= n ) x ++ ;
while ( x * x > n ) x -- ;
return x ;
}
// return g=gcd(a,b)
// a*x+b*y=g
// - b!=0 -> 0<=x<|b|/g
// - b=0 -> ax=g
template < class T >
T ext_gcd ( T a , T b , T & x , T & y ) {
T a0 = a , b0 = b ;
bool sgn_a = a < 0 , sgn_b = b < 0 ;
if ( sgn_a ) a = - a ;
if ( sgn_b ) b = - b ;
if ( b == 0 ) {
x = sgn_a ? - 1 : 1 ;
y = 0 ;
return a ;
}
T x00 = 1 , x01 = 0 , x10 = 0 , x11 = 1 ;
while ( b != 0 ) {
T q = a / b , r = a - b * q ;
x00 -= q * x01 ;
x10 -= q * x11 ;
swap ( x00 , x01 );
swap ( x10 , x11 );
a = b , b = r ;
}
x = x00 , y = x10 ;
if ( sgn_a ) x = - x ;
if ( sgn_b ) y = - y ;
if ( b0 != 0 ) {
a0 /= a , b0 /= a ;
if ( b0 < 0 ) a0 = - a0 , b0 = - b0 ;
T q = x >= 0 ? x / b0 : ( x + 1 ) / b0 - 1 ;
x -= b0 * q ;
y += a0 * q ;
}
return a ;
}
constexpr long long inv_mod ( long long x , long long m ) {
x %= m ;
if ( x < 0 ) x += m ;
long long a = m , b = x ;
long long y0 = 0 , y1 = 1 ;
while ( b > 0 ) {
long long q = a / b ;
swap ( a -= q * b , b );
swap ( y0 -= q * y1 , y1 );
}
if ( y0 < 0 ) y0 += m / a ;
return y0 ;
}
long long pow_mod ( long long x , long long n , long long m ) {
x = ( x % m + m ) % m ;
long long y = 1 ;
while ( n ) {
if ( n & 1 ) y = y * x % m ;
x = x * x % m ;
n >>= 1 ;
}
return y ;
}
constexpr long long pow_mod_constexpr ( long long x , long long n , int m ) {
if ( m == 1 ) return 0 ;
unsigned int _m = ( unsigned int )( m );
unsigned long long r = 1 ;
unsigned long long y = x % m ;
if ( y >= m ) y += m ;
while ( n ) {
if ( n & 1 ) r = ( r * y ) % _m ;
y = ( y * y ) % _m ;
n >>= 1 ;
}
return r ;
}
constexpr bool is_prime_constexpr ( int n ) {
if ( n <= 1 ) return false ;
if ( n == 2 || n == 7 || n == 61 ) return true ;
if ( n % 2 == 0 ) return false ;
long long d = n - 1 ;
while ( d % 2 == 0 ) d /= 2 ;
constexpr long long bases [ 3 ] = { 2 , 7 , 61 };
for ( long long a : bases ) {
long long t = d ;
long long y = pow_mod_constexpr ( a , t , n );
while ( t != n - 1 && y != 1 && y != n - 1 ) {
y = y * y % n ;
t <<= 1 ;
}
if ( y != n - 1 && t % 2 == 0 ) {
return false ;
}
}
return true ;
}
template < int n >
constexpr bool is_prime = is_prime_constexpr ( n );
}; // namespace Math
#line 2 "math/barrett.hpp"
struct barrett {
unsigned int _m ;
unsigned long long im ;
explicit barrett ( unsigned int m ) : _m ( m ), im (( unsigned long long )( - 1 ) / m + 1 ) {}
unsigned int umod () const { return _m ; }
unsigned int mul ( unsigned int a , unsigned int b ) const {
unsigned long long z = a ;
z *= b ;
#ifdef _MSC_VER
unsigned long long x ;
_umul128 ( z , im , & x );
#else
unsigned long long x = ( unsigned long long )((( unsigned __int128 )( z ) * im ) >> 64 );
#endif
unsigned long long y = x * _m ;
return ( unsigned int )( z - y + ( z < y ? _m : 0 ));
}
};
#line 4 "modint/dynamic-modint.hpp"
template < int id >
struct DynamicModInt {
using mint = DynamicModInt ;
static void set_mod ( int m ) {
assert ( 1 <= m );
bar = barrett ( m );
}
static constexpr unsigned int get_mod () { return ( int ) bar . umod (); }
static mint raw ( int v ) {
mint x ;
x . _v = v ;
return x ;
}
DynamicModInt () : _v ( 0 ) {}
DynamicModInt ( int64_t v ) {
long long x = ( long long )( v % ( long long )( bar . umod ()));
if ( x < 0 ) x += umod ();
_v = ( unsigned int )( x );
}
unsigned int val () const { return _v ; }
mint & operator ++ () {
_v ++ ;
if ( _v == umod ()) _v = 0 ;
return * this ;
}
mint & operator -- () {
if ( _v == 0 ) _v = umod ();
_v -- ;
return * this ;
}
mint operator ++ ( int ) {
mint result = * this ;
++* this ;
return result ;
}
mint operator -- ( int ) {
mint result = * this ;
--* this ;
return result ;
}
mint & operator += ( const mint & rhs ) {
_v += rhs . _v ;
if ( _v >= umod ()) _v -= umod ();
return * this ;
}
mint & operator -= ( const mint & rhs ) {
_v -= rhs . _v ;
if ( _v >= umod ()) _v += umod ();
return * this ;
}
mint & operator *= ( const mint & rhs ) {
_v = bar . mul ( _v , rhs . _v );
return * this ;
}
mint & operator /= ( const mint & rhs ) { return * this = * this * rhs . inv (); }
mint operator + () const { return * this ; }
mint operator - () const { return mint () - * this ; }
mint pow ( long long n ) const {
assert ( 0 <= n );
mint x = * this , r = 1 ;
while ( n ) {
if ( n & 1 ) r *= x ;
x *= x ;
n >>= 1 ;
}
return r ;
}
mint inv () const {
auto inv = Math :: inv_mod ( _v , umod ());
return raw ( inv );
}
friend mint operator + ( const mint & lhs , const mint & rhs ) { return mint ( lhs ) += rhs ; }
friend mint operator - ( const mint & lhs , const mint & rhs ) { return mint ( lhs ) -= rhs ; }
friend mint operator * ( const mint & lhs , const mint & rhs ) { return mint ( lhs ) *= rhs ; }
friend mint operator / ( const mint & lhs , const mint & rhs ) { return mint ( lhs ) /= rhs ; }
friend bool operator == ( const mint & lhs , const mint & rhs ) { return lhs . _v == rhs . _v ; }
friend bool operator != ( const mint & lhs , const mint & rhs ) { return lhs . _v != rhs . _v ; }
friend istream & operator >> ( istream & is , mint & x ) {
int64_t v ;
is >> v ;
x = mint ( v );
return is ;
}
friend ostream & operator << ( ostream & os , const mint & x ) { return os << x . val (); }
private:
unsigned int _v ;
static constexpr unsigned int umod () { return bar . umod (); }
static barrett bar ;
};
template < int id >
barrett DynamicModInt < id >:: bar ( 998244353 );
#line 5 "verify/fps/LC_montmort_number_mod.test.cpp"
using mint = DynamicModInt < 0 > ;
#line 2 "modint/factorial.hpp"
template < class mint >
struct Factorial {
static void reserve ( int n ) {
inv ( n );
fact ( n );
fact_inv ( n );
}
static mint inv ( int n ) {
static long long mod = mint :: get_mod ();
static vector < mint > buf ({ 0 , 1 });
assert ( n != 0 );
if ( mod != mint :: get_mod ()) {
mod = mint :: get_mod ();
buf = vector < mint > ({ 0 , 1 });
}
while (( int ) buf . capacity () <= n ) buf . reserve ( buf . capacity () * 2 );
while (( int ) buf . size () <= n ) {
long long k = buf . size (), q = ( mod + k - 1 ) / k ;
buf . push_back ( q * buf [ k * q - mod ]);
}
return buf [ n ];
}
static mint fact ( int n ) {
static long long mod = mint :: get_mod ();
static vector < mint > buf ({ 1 , 1 });
assert ( n >= 0 );
if ( mod != mint :: get_mod ()) {
mod = mint :: get_mod ();
buf = vector < mint > ({ 1 , 1 });
}
while (( int ) buf . capacity () <= n ) buf . reserve ( buf . capacity () * 2 );
while (( int ) buf . size () <= n ) {
long long k = buf . size ();
buf . push_back ( buf . back () * k );
}
return buf [ n ];
}
static mint fact_inv ( int n ) {
static long long mod = mint :: get_mod ();
static vector < mint > buf ({ 1 , 1 });
assert ( n >= 0 );
if ( mod != mint :: get_mod ()) {
mod = mint :: get_mod ();
buf = vector < mint > ({ 1 , 1 });
}
if (( int ) buf . size () <= n ) inv ( n );
while (( int ) buf . capacity () <= n ) buf . reserve ( buf . capacity () * 2 );
while (( int ) buf . size () <= n ) {
long long k = buf . size ();
buf . push_back ( buf . back () * inv ( k ));
}
return buf [ n ];
}
static mint binom ( int n , int r ) {
if ( r < 0 || r > n ) return 0 ;
return fact ( n ) * fact_inv ( r ) * fact_inv ( n - r );
}
static mint binom_naive ( int n , int r ) {
if ( r < 0 || r > n ) return 0 ;
mint res = fact_inv ( r );
for ( int i = 0 ; i < r ; i ++ ) res *= n - i ;
return res ;
}
static mint multinom ( const vector < int >& r ) {
int n = 0 ;
for ( auto & x : r ) {
if ( x < 0 ) return 0 ;
n += x ;
}
mint res = fact ( n );
for ( auto & x : r ) res *= fact_inv ( x );
return res ;
}
static mint P ( int n , int r ) {
if ( r < 0 || r > n ) return 0 ;
return fact ( n ) * fact_inv ( n - r );
}
// partition n items to r groups (allow empty group)
static mint H ( int n , int r ) {
if ( n < 0 || r < 0 ) return 0 ;
return r == 0 ? 1 : binom ( n + r - 1 , r );
}
};
/**
* @brief 階乗, 二項係数
*/
#line 2 "math/lpf-table.hpp"
vector < int > LPFTable ( int n ) {
vector < int > lpf ( n + 1 , 0 );
iota ( lpf . begin (), lpf . end (), 0 );
for ( int p = 2 ; p * p <= n ; p += ( p & 1 ) + 1 ) {
if ( lpf [ p ] != p ) continue ;
for ( int i = p * p ; i <= n ; i += p )
if ( lpf [ i ] == i ) lpf [ i ] = p ;
}
return lpf ;
}
/**
* @brief LPF Table
*/
#line 3 "modint/power-table.hpp"
// 0^k,1^k,2^k,...,n^k
template < class T >
vector < T > PowerTable ( int n , int k ) {
assert ( k >= 0 );
vector < T > f ;
if ( k == 0 ) {
f = vector < T > ( n + 1 , 0 );
f [ 0 ] = 1 ;
} else {
f = vector < T > ( n + 1 , 1 );
f [ 0 ] = 0 ;
auto lpf = LPFTable ( n );
for ( int i = 2 ; i <= n ; i ++ )
f [ i ] = lpf [ i ] == i ? T ( i ). pow ( k ) : f [ i / lpf [ i ]] * f [ lpf [ i ]];
}
return f ;
}
/**
* @brief Power Table
*/
#line 2 "fps/formal-power-series.hpp"
template < class mint >
struct FormalPowerSeries : vector < mint > {
using vector < mint >:: vector ;
using FPS = FormalPowerSeries ;
FormalPowerSeries ( const vector < mint >& r ) : vector < mint > ( r ) {}
FormalPowerSeries ( vector < mint >&& r ) : vector < mint > ( std :: move ( r )) {}
FPS & operator = ( const vector < mint >& r ) {
vector < mint >:: operator = ( r );
return * this ;
}
FPS & operator += ( const FPS & r ) {
if ( r . size () > this -> size ()) this -> resize ( r . size ());
for ( int i = 0 ; i < ( int ) r . size (); i ++ ) ( * this )[ i ] += r [ i ];
return * this ;
}
FPS & operator += ( const mint & r ) {
if ( this -> empty ()) this -> resize ( 1 );
( * this )[ 0 ] += r ;
return * this ;
}
FPS & operator -= ( const FPS & r ) {
if ( r . size () > this -> size ()) this -> resize ( r . size ());
for ( int i = 0 ; i < ( int ) r . size (); i ++ ) ( * this )[ i ] -= r [ i ];
return * this ;
}
FPS & operator -= ( const mint & r ) {
if ( this -> empty ()) this -> resize ( 1 );
( * this )[ 0 ] -= r ;
return * this ;
}
FPS & operator *= ( const mint & v ) {
for ( int k = 0 ; k < ( int ) this -> size (); k ++ ) ( * this )[ k ] *= v ;
return * this ;
}
FPS & operator /= ( const FPS & r ) {
if ( this -> size () < r . size ()) {
this -> clear ();
return * this ;
}
int n = this -> size () - r . size () + 1 ;
if (( int ) r . size () <= 64 ) {
FPS f ( * this ), g ( r );
g . shrink ();
mint coeff = g . at ( g . size () - 1 ). inv ();
for ( auto & x : g ) x *= coeff ;
int deg = ( int ) f . size () - ( int ) g . size () + 1 ;
int gs = g . size ();
FPS quo ( deg );
for ( int i = deg - 1 ; i >= 0 ; i -- ) {
quo [ i ] = f [ i + gs - 1 ];
for ( int j = 0 ; j < gs ; j ++ ) f [ i + j ] -= quo [ i ] * g [ j ];
}
* this = quo * coeff ;
this -> resize ( n , mint ( 0 ));
return * this ;
}
return * this = (( * this ). rev (). pre ( n ) * r . rev (). inv ( n )). pre ( n ). rev ();
}
FPS & operator %= ( const FPS & r ) {
* this -= * this / r * r ;
shrink ();
return * this ;
}
FPS operator + ( const FPS & r ) const { return FPS ( * this ) += r ; }
FPS operator + ( const mint & v ) const { return FPS ( * this ) += v ; }
FPS operator - ( const FPS & r ) const { return FPS ( * this ) -= r ; }
FPS operator - ( const mint & v ) const { return FPS ( * this ) -= v ; }
FPS operator * ( const FPS & r ) const { return FPS ( * this ) *= r ; }
FPS operator * ( const mint & v ) const { return FPS ( * this ) *= v ; }
FPS operator / ( const FPS & r ) const { return FPS ( * this ) /= r ; }
FPS operator % ( const FPS & r ) const { return FPS ( * this ) %= r ; }
FPS operator - () const {
FPS ret ( this -> size ());
for ( int i = 0 ; i < ( int ) this -> size (); i ++ ) ret [ i ] = - ( * this )[ i ];
return ret ;
}
void shrink () {
while ( this -> size () && this -> back () == mint ( 0 )) this -> pop_back ();
}
FPS rev () const {
FPS ret ( * this );
reverse ( begin ( ret ), end ( ret ));
return ret ;
}
FPS dot ( FPS r ) const {
FPS ret ( min ( this -> size (), r . size ()));
for ( int i = 0 ; i < ( int ) ret . size (); i ++ ) ret [ i ] = ( * this )[ i ] * r [ i ];
return ret ;
}
FPS pre ( int sz ) const {
return FPS ( begin ( * this ), begin ( * this ) + min (( int ) this -> size (), sz ));
}
FPS operator >>= ( int sz ) {
assert ( sz >= 0 );
if (( int ) this -> size () <= sz )
this -> clear ();
else
this -> erase ( this -> begin (), this -> begin () + sz );
return * this ;
}
FPS operator >> ( int sz ) const {
if (( int ) this -> size () <= sz ) return {};
FPS ret ( * this );
ret . erase ( ret . begin (), ret . begin () + sz );
return ret ;
}
FPS operator <<= ( int sz ) {
assert ( sz >= 0 );
this -> insert ( this -> begin (), sz , mint ( 0 ));
return * this ;
}
FPS operator << ( int sz ) const {
FPS ret ( * this );
ret . insert ( ret . begin (), sz , mint ( 0 ));
return ret ;
}
FPS diff () const {
const int n = ( int ) this -> size ();
FPS ret ( max ( 0 , n - 1 ));
mint one ( 1 ), coeff ( 1 );
for ( int i = 1 ; i < n ; i ++ ) {
ret [ i - 1 ] = ( * this )[ i ] * coeff ;
coeff += one ;
}
return ret ;
}
FPS integral () const {
const int n = ( int ) this -> size ();
FPS ret ( n + 1 );
ret [ 0 ] = mint ( 0 );
if ( n > 0 ) ret [ 1 ] = mint ( 1 );
auto mod = mint :: get_mod ();
for ( int i = 2 ; i <= n ; i ++ ) ret [ i ] = ( - ret [ mod % i ]) * ( mod / i );
for ( int i = 0 ; i < n ; i ++ ) ret [ i + 1 ] *= ( * this )[ i ];
return ret ;
}
mint eval ( mint x ) const {
mint r = 0 , w = 1 ;
for ( auto & v : * this ) r += w * v , w *= x ;
return r ;
}
FPS log ( int deg = - 1 ) const {
assert (( * this )[ 0 ] == mint ( 1 ));
if ( deg == - 1 ) deg = ( int ) this -> size ();
return ( this -> diff () * this -> inv ( deg )). pre ( deg - 1 ). integral ();
}
FPS pow ( int64_t k , int deg = - 1 ) const {
const int n = ( int ) this -> size ();
if ( deg == - 1 ) deg = n ;
if ( k == 0 ) {
FPS ret ( deg );
if ( deg ) ret [ 0 ] = 1 ;
return ret ;
}
for ( int i = 0 ; i < n ; i ++ ) {
if (( * this )[ i ] != mint ( 0 )) {
mint rev = mint ( 1 ) / ( * this )[ i ];
FPS ret = ((( * this * rev ) >> i ). log ( deg ) * k ). exp ( deg );
ret *= ( * this )[ i ]. pow ( k );
ret = ( ret << ( i * k )). pre ( deg );
if (( int ) ret . size () < deg ) ret . resize ( deg , mint ( 0 ));
return ret ;
}
if ( __int128_t ( i + 1 ) * k >= deg ) return FPS ( deg , mint ( 0 ));
}
return FPS ( deg , mint ( 0 ));
}
static void * ntt_ptr ;
static void set_ntt ();
FPS & operator *= ( const FPS & r );
FPS middle_product ( const FPS & r ) const ;
void ntt ();
void intt ();
void ntt_doubling ();
static int ntt_root ();
FPS inv ( int deg = - 1 ) const ;
FPS exp ( int deg = - 1 ) const ;
};
template < typename mint >
void * FormalPowerSeries < mint >:: ntt_ptr = nullptr ;
#line 4 "fps/taylor-shift.hpp"
// f(x+a)
template < class mint >
FormalPowerSeries < mint > TaylorShift ( FormalPowerSeries < mint > f , mint a ) {
using fps = FormalPowerSeries < mint > ;
int n = f . size ();
using fact = Factorial < mint > ;
fact :: reserve ( n );
for ( int i = 0 ; i < n ; i ++ ) f [ i ] *= fact :: fact ( i );
reverse ( f . begin (), f . end ());
fps g ( n , mint ( 1 ));
for ( int i = 1 ; i < n ; i ++ ) g [ i ] = g [ i - 1 ] * a * fact :: inv ( i );
f = ( f * g ). pre ( n );
reverse ( f . begin (), f . end ());
for ( int i = 0 ; i < n ; i ++ ) f [ i ] *= fact :: fact_inv ( i );
return f ;
}
/**
* @brief Taylor Shift
* @docs docs/fps/taylor-shift.md
*/
#line 6 "fps/famous-sequences.hpp"
template < class mint >
FormalPowerSeries < mint > PartitionFunction ( int n ) {
FormalPowerSeries < mint > g ( n + 1 );
for ( int k = 0 ; k * ( 3 * k - 1 ) / 2 <= n ; k ++ ) g [ k * ( 3 * k - 1 ) / 2 ] += k & 1 ? - 1 : 1 ;
for ( int k = 1 ; k * ( 3 * k + 1 ) / 2 <= n ; k ++ ) g [ k * ( 3 * k + 1 ) / 2 ] += k & 1 ? - 1 : 1 ;
return g . inv ( n + 1 );
}
template < class mint >
FormalPowerSeries < mint > BellNumber ( int n ) {
using fact = Factorial < mint > ;
FormalPowerSeries < mint > f ( n + 1 );
for ( int i = 1 ; i < f . size (); i ++ ) f [ i ] = fact :: fact_inv ( i );
f = f . exp ();
for ( int i = 0 ; i < f . size (); i ++ ) f [ i ] *= fact :: fact ( i );
return f ;
}
template < class mint >
vector < mint > MontmortNumber ( int n ) {
vector < mint > f ( n + 1 );
f [ 0 ] = 1 , f [ 1 ] = 0 ;
for ( int i = 2 ; i < f . size (); i ++ ) f [ i ] = ( i - 1 ) * ( f [ i - 1 ] + f [ i - 2 ]);
return f ;
}
template < class mint >
FormalPowerSeries < mint > FirstKindStirlingNumbers ( int n ) {
FormalPowerSeries < mint > f { 1 };
for ( int l = 30 ; l >= 0 ; l -- ) {
if ( f . size () > 1 ) f *= TaylorShift ( f , mint ( - ( n >> ( l + 1 ))));
if (( n >> l ) & 1 ) f = ( f << 1 ) - f * mint (( n >> l ) - 1 );
}
return f ;
}
template < class mint >
FormalPowerSeries < mint > FirstKindStirlingNumbersFixedK ( int n , int k ) {
using fact = Factorial < mint > ;
if ( k > n ) return FormalPowerSeries < mint > {};
FormalPowerSeries < mint > f ( n - k + 1 );
for ( int i = 0 ; i < f . size (); i ++ ) f [ i ] = fact :: inv ( i + 1 ) * ( i & 1 ? - 1 : 1 );
f = f . pow ( k );
f *= fact :: fact_inv ( k );
for ( int i = 0 ; i < f . size (); i ++ ) f [ i ] *= fact :: fact ( i + k );
return f ;
}
template < class mint >
FormalPowerSeries < mint > SecondKindStirlingNumbers ( int n ) {
using fact = Factorial < mint > ;
FormalPowerSeries < mint > f ( n + 1 );
for ( int i = 0 ; i < f . size (); i ++ ) f [ i ] = fact :: fact_inv ( i ) * ( i & 1 ? - 1 : 1 );
FormalPowerSeries < mint > g ( PowerTable < mint > ( n , n ));
for ( int i = 0 ; i < g . size (); i ++ ) g [ i ] *= fact :: fact_inv ( i );
f *= g ;
f . resize ( n + 1 );
return f ;
}
template < class mint >
FormalPowerSeries < mint > SecondKindStirlingNumbersFixedK ( int n , int k ) {
using fact = Factorial < mint > ;
if ( k > n ) return FormalPowerSeries < mint > {};
FormalPowerSeries < mint > f ( n - k + 1 );
for ( int i = 0 ; i < f . size (); i ++ ) f [ i ] = fact :: fact_inv ( i + 1 );
f = f . pow ( k );
f *= fact :: fact_inv ( k );
for ( int i = 0 ; i < f . size (); i ++ ) f [ i ] *= fact :: fact ( i + k );
return f ;
}
/**
* @brief 有名数列
* @docs docs/fps/famous-sequences.md
*/
#line 7 "verify/fps/LC_montmort_number_mod.test.cpp"
int main () {
int n , m ;
in ( n , m );
mint :: set_mod ( m );
auto a = MontmortNumber < mint > ( n );
a . erase ( a . begin ());
out ( a );
}