C[i]=A[i]*B[i];
FFT : C[i]= ∑ia=0 A[a]*B[i-a] (0<=i<=n)
NTT : C[i]= ∑ia=0 A[a]*B[i-a]%p (0<=i<=n)
C[i]相当于多项式乘法中x^i的系数,A[],B[]表示两个多项式的系数
g:p的原根
len1 : A的最高次项次数+1
len2 : B的最高次项次数+1
n : A的最高次项次数+B的最高次项次数
typedef long long ll;
#define f(x,y,z) for(int x=y;x<=z;x++)
using namespace std;
const int N=400005;
const int g=3;//原根
const ll p=7340033;
int len,len1,len2,x,y,Q,sum[4],T,n;
ll a[N],b[N],qp[30],jie[100005],ni[100005];
void rader(ll* F,int len)
{
int j=len/2;
f(i,1,len-2)
{
if(i<j)swap(F[i],F[j]);
int k=len/2;
while(j>=k)
{
j-=k;
k>>=1;
}
if(j<k)j+=k;
}
}
void NTT(ll* F,int len,int t)
{
int id=0;
rader(F,len);
for(int h=2;h<=len;h<<=1)
{
id++;
for(int j=0;j<len;j+=h)
{
ll E=1;///原根次幂
for(int k=j;k<j+h/2;k++)
{
ll u=F[k];///蝶型操作
ll v=(E*F[k+h/2])%p;
F[k]=(u+v)%p;///前半部分
F[k+h/2]=((u-v)%p+p)%p;///后半部分
E=(E*qp[id])%p;
}
}
}
if(t==-1)///插值
{
f(i,1,len/2-1)swap(F[i],F[len-i]);///i+lne-i=i;
ll inv=power(len,p-2,p);///逆元
f(i,0,len-1)F[i]=(F[i]%p*inv)%p;
}
}
void work(int len1,int len2)
{
len=1;
while(len<=2*len1||len<=2*len2)len<<=1;
f(i,0,20)
{
int t=1<<i;
qp[i]=power(g,(p-1)/t,p);
}
NTT(a,len,1);
NTT(b,len,1);
f(i,0,len-1)a[i]=(a[i]*b[i])%p;
NTT(a,len,-1);
}