const int mod = 1004535809;
const int maxn = 262144;
const int G = 3;
int Qpow( int a , int b , int m )
{
if ( b<0 )
{
b = -b;
a = Qpow( a , m-2 , m );
}
int res = 1;
while ( b )
{
if ( b&1 )
res = 1LL*res*a%m;
a = 1LL*a*a%m;
b = b>>1;
}
return res;
}
int rev[maxn];
void Get_rev( int bit )
{
for ( int i=0 ; i<(1<<bit) ; i++ )
rev[i] = (rev[i>>1]>>1)|((i&1)<<(bit-1));
}
void NTT( int *a , int n , int dft )
{
for ( int i=0 ; i<n ; i++ )
if ( i<rev[i] )
swap ( a[i] , a[rev[i]] );
for ( int step=1 ; step<n ; step<<=1 )
{
int wn = Qpow( G , dft*(mod-1)/(step*2) , mod );
for ( int j=0 ; j<n ; j+=step<<1 )
{
int wnk = 1;
for ( int k=j ; k<j+step ; k++ )
{
int x = a[k]%mod;
int y = 1LL*wnk*a[k+step]%mod;
a[k] = (x+y)%mod;
a[k+step] = ((x-y)%mod+mod)%mod;
wnk = 1LL*wnk*wn%mod;
}
}
}
if ( dft==-1 )
{
int inv = Qpow( n , mod-2 , mod );
for ( int i=0 ; i<n ; i++ )
a[i] = 1LL*a[i]*inv%mod;
}
}