提交记录 20614


用户 题目 状态 得分 用时 内存 语言 代码长度
liqingyang 1002. 测测你的多项式乘法 Accepted 100 326.793 ms 36496 KB C++ 1.23 KB
提交时间 评测时间
2023-11-29 14:41:18 2023-11-29 14:41:20
#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);
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1326.793 ms35 MB + 656 KBAcceptedScore: 100


Judge Duck Online | 评测鸭在线
Server Time: 2025-07-18 13:05:28 | Loaded in 0 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠