#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
typedef complex< double > base;
typedef vector< base> poly;
const double PI = acos ( - 1 ) ;
void fft( poly & f, bool inv = 0 ) {
int n = f.size ( ) , j = 0 ;
vector< base> root( n >> 1 ) ;
for ( int i= 1 ; i< n; i++ ) {
int bit = ( n >> 1 ) ;
while ( j >= bit) {
j - = bit; bit >>= 1 ;
}
j + = bit;
if ( i < j) swap( f[ i] , f[ j] ) ;
}
double ang = 2 * PI / n; if ( inv) ang * = - 1 ;
for ( int i= 0 ; i< ( n >> 1 ) ; i++ ) root[ i] = base( cos ( ang* i) , sin ( ang* i) ) ;
for ( int i= 2 ; i<= n; i<<= 1 ) {
int step = n / i;
for ( int j= 0 ; j< n; j+ = i) {
for ( int k= 0 ; k< ( i >> 1 ) ; k++ ) {
base u = f[ j | k] , v = f[ j | k | i >> 1 ] * root[ step * k] ;
f[ j | k] = u + v;
f[ j | k | i >> 1 ] = u - v;
}
}
}
if ( inv) for ( int i= 0 ; i< n; i++ ) f[ i] / = n;
}
vector< ll> multiply_mod( vector< ll> & _a, vector< ll> & _b, ll mod) {
int n = 2 ;
while ( n < _a.size ( ) + _b.size ( ) ) n <<= 1 ;
poly a1( n) , a2( n) , b1( n) , b2( n) ;
for ( int i= 0 ; i< _a.size ( ) ; i++ ) {
a1[ i] = _a[ i] & 32767 ;
a2[ i] = _a[ i] >> 15 ;
}
for ( int i= 0 ; i< _b.size ( ) ; i++ ) {
b1[ i] = _b[ i] & 32767 ;
b2[ i] = _b[ i] >> 15 ;
}
fft( a1) ; fft( a2) ; fft( b1) ; fft( b2) ;
poly r1( n) , r2( n) , r3( n) ;
for ( int i= 0 ; i< n; i++ ) {
r1[ i] = a1[ i] * b1[ i] ;
r2[ i] = a1[ i] * b2[ i] + a2[ i] * b1[ i] ;
r3[ i] = a2[ i] * b2[ i] ;
}
fft( r1, 1 ) ; fft( r2, 1 ) ; fft( r3, 1 ) ;
vector< ll> ret( n) ;
for ( int i= 0 ; i< n; i++ ) {
ll a = llround( r1[ i] .real ( ) ) ;
ll b = llround( r2[ i] .real ( ) ) ;
ll c = llround( r3[ i] .real ( ) ) ;
a % = mod; b % = mod; c % = mod;
ret[ i] = a + ( b << 15 ) + ( c << 30 ) ;
ret[ i] % = mod; if ( ret[ i] < 0 ) ret[ i] + = mod;
}
return ret;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSwgdi5lbmQoKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgY29tcGxleDxkb3VibGU+IGJhc2U7CnR5cGVkZWYgdmVjdG9yPGJhc2U+IHBvbHk7CmNvbnN0IGRvdWJsZSBQSSA9IGFjb3MoLTEpOwoKdm9pZCBmZnQocG9seSAmZiwgYm9vbCBpbnYgPSAwKXsKICAgIGludCBuID0gZi5zaXplKCksIGogPSAwOwogICAgdmVjdG9yPGJhc2U+IHJvb3QobiA+PiAxKTsKICAgIGZvcihpbnQgaT0xOyBpPG47IGkrKyl7CiAgICAgICAgaW50IGJpdCA9IChuID4+IDEpOwogICAgICAgIHdoaWxlKGogPj0gYml0KXsKICAgICAgICAgICAgaiAtPSBiaXQ7IGJpdCA+Pj0gMTsKICAgICAgICB9CiAgICAgICAgaiArPSBiaXQ7CiAgICAgICAgaWYoaSA8IGopIHN3YXAoZltpXSwgZltqXSk7CiAgICB9CiAgICBkb3VibGUgYW5nID0gMiAqIFBJIC8gbjsgaWYoaW52KSBhbmcgKj0gLTE7CiAgICBmb3IoaW50IGk9MDsgaTwobiA+PiAxKTsgaSsrKSByb290W2ldID0gYmFzZShjb3MoYW5nKmkpLCBzaW4oYW5nKmkpKTsKICAgIGZvcihpbnQgaT0yOyBpPD1uOyBpPDw9MSl7CiAgICAgICAgaW50IHN0ZXAgPSBuIC8gaTsKICAgICAgICBmb3IoaW50IGo9MDsgajxuOyBqKz1pKXsKICAgICAgICAgICAgZm9yKGludCBrPTA7IGs8KGkgPj4gMSk7IGsrKyl7CiAgICAgICAgICAgICAgICBiYXNlIHUgPSBmW2ogfCBrXSwgdiA9IGZbaiB8IGsgfCBpID4+IDFdICogcm9vdFtzdGVwICoga107CiAgICAgICAgICAgICAgICBmW2ogfCBrXSA9IHUgKyB2OwogICAgICAgICAgICAgICAgZltqIHwgayB8IGkgPj4gMV0gPSB1IC0gdjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmKGludikgZm9yKGludCBpPTA7IGk8bjsgaSsrKSBmW2ldIC89IG47Cn0KCnZlY3RvcjxsbD4gbXVsdGlwbHlfbW9kKHZlY3RvcjxsbD4gJl9hLCB2ZWN0b3I8bGw+ICZfYiwgbGwgbW9kKXsKICAgIGludCBuID0gMjsKICAgIHdoaWxlKG4gPCBfYS5zaXplKCkgKyBfYi5zaXplKCkpIG4gPDw9IDE7CiAgICBwb2x5IGExKG4pLCBhMihuKSwgYjEobiksIGIyKG4pOwogICAgZm9yKGludCBpPTA7IGk8X2Euc2l6ZSgpOyBpKyspewogICAgICAgIGExW2ldID0gX2FbaV0gJiAzMjc2NzsKICAgICAgICBhMltpXSA9IF9hW2ldID4+IDE1OwogICAgfQogICAgZm9yKGludCBpPTA7IGk8X2Iuc2l6ZSgpOyBpKyspewogICAgICAgIGIxW2ldID0gX2JbaV0gJiAzMjc2NzsKICAgICAgICBiMltpXSA9IF9iW2ldID4+IDE1OwogICAgfQogICAgZmZ0KGExKTsgZmZ0KGEyKTsgZmZ0KGIxKTsgZmZ0KGIyKTsKICAgIHBvbHkgcjEobiksIHIyKG4pLCByMyhuKTsKICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKyl7CiAgICAgICAgcjFbaV0gPSBhMVtpXSAqIGIxW2ldOwogICAgICAgIHIyW2ldID0gYTFbaV0gKiBiMltpXSArIGEyW2ldICogYjFbaV07CiAgICAgICAgcjNbaV0gPSBhMltpXSAqIGIyW2ldOwogICAgfQogICAgZmZ0KHIxLCAxKTsgZmZ0KHIyLCAxKTsgZmZ0KHIzLCAxKTsKICAgIHZlY3RvcjxsbD4gcmV0KG4pOwogICAgZm9yKGludCBpPTA7IGk8bjsgaSsrKXsKICAgICAgICBsbCBhID0gbGxyb3VuZChyMVtpXS5yZWFsKCkpOwogICAgICAgIGxsIGIgPSBsbHJvdW5kKHIyW2ldLnJlYWwoKSk7CiAgICAgICAgbGwgYyA9IGxscm91bmQocjNbaV0ucmVhbCgpKTsKICAgICAgICBhICU9IG1vZDsgYiAlPSBtb2Q7IGMgJT0gbW9kOwogICAgICAgIHJldFtpXSA9IGEgKyAoYiA8PCAxNSkgKyAoYyA8PCAzMCk7CiAgICAgICAgcmV0W2ldICU9IG1vZDsgaWYocmV0W2ldIDwgMCkgcmV0W2ldICs9IG1vZDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0=