#include<cstring>
#include<algorithm>
using namespace std;
const unsigned int mod=998244353,G=3;
inline int qpow(int a,int b)
{
int ret=1;
while(b)
{
if(b&1)
{
ret=(long long)
ret*a%mod;
}
a=(long long)
a*a%mod,b>>=1;
}
return ret;
}
inline int add(int x,int y)
{
x+=y;
return x<mod?x:x-mod;
}
inline void NTT(int n,int *f)
{
static int g[1<<21];
for(int i=0;i<n;i++)
{
if((g[i]=(g[i>>1]|(i&1)*n)>>1)>i)
{
swap(f[i],f[g[i]]);
}
}
static int w[1<<20];
w[0]=1;
for(int i=1;i<n;i<<=1)
{
int W=qpow(G,(mod-1)/(i<<1));
for(int j=1;j<i;j++)
{
w[j]=(long long)
w[j-1]*W%mod;
}
for(int j=0;j<n;j+=i<<1)
{
for(int k=0;k<i;k++)
{
int x=f[j|k],y=(long long)w[k]*f[i|j|k]%mod;
f[j|k]=add(x,y),f[i|j|k]=add(x,mod-y);
}
}
}
}
inline void convolution(int n,int m,unsigned int *a,unsigned int *b,unsigned int *c)
{
int N=1<<__lg(n+m)+1;
static int f[1<<21],g[1<<21];
memcpy(f,a,n+1<<2),NTT(N,f);
memcpy(g,b,m+1<<2),NTT(N,g);
for(int i=0;i<N;i++)
{
f[i]=(long long)
f[i]*g[i]%mod;
}
NTT(N,f);
int inv=qpow(N,mod-2);
for(int i=0;i<=n+m;i++)
{
c[i]=(long long)
f[N-i&N-1]*inv%mod;
}
}
void poly_multiply(unsigned *a, int n, unsigned *b, int m, unsigned *c)
{
convolution(n,m,a,b,c);
}
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Testcase #1 | 326.793 ms | 35 MB + 656 KB | Accepted | Score: 100 | 显示更多 |