社区讨论
初学者ntt模板求助
P3803【模板】多项式乘法(FFT)参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo29posf
- 此快照首次捕获于
- 2023/10/23 10:17 2 年前
- 此快照最后确认于
- 2023/11/03 10:30 2 年前
rt
CPP#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e6+10, mod=998244353, g=3;
ll n,m,a[maxn],b[maxn],c[maxn],r[maxn];
ll power(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
void ntt(ll n,ll *a)
{
for(ll i=0;i<(1<<n);i++)
if(i<r[i]) swap(a[i],a[r[i]]);
for(ll i=0;i<n;i++)
{
ll G=power(g,(mod-1)/(1<<i+1));
for(ll j=0;j<(1<<n);j+=(1<<i+1))
{
for(ll k=0,g0=1;k<(1<<i);k++,g0=g0*G%mod)
{
ll a1=a[j+k], a2=a[(1<<i)+j+k], t=a2*g0%mod;
a[j+k]=(a1+t)%mod;
a[(1<<i)+j+k]=(a1-t+mod)%mod;
}
}
}
}
int main()
{
scanf("%lld%lld",&n,&m);
for(ll i=0;i<=n;i++) scanf("%lld",a+i);
for(ll i=0;i<=m;i++) scanf("%lld",b+i);
ll s=n+m, p=0;
while((1<<p)<=s) ++p;
for(ll i=1;i<(1<<p);i++)
r[i]=(r[i>>1]>>1)|((i&1)<<p-1);
ntt(p,a);
ntt(p,b);
for(ll i=0;i<(1<<p);i++) c[i]=a[i]*b[i]%mod;
ntt(p,c);
reverse(c+1,c+(1<<p));
ll inv=power(s+1,mod-2);
for(ll i=0;i<=s;i++) printf("%lld ",c[i]*inv%mod);
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...