提交记录 17086


用户 题目 状态 得分 用时 内存 语言 代码长度
asd_a 1002. 测测你的多项式乘法 Wrong Answer 0 215.298 ms 57004 KB C++ 3.60 KB
提交时间 评测时间
2021-11-30 19:41:35 2021-11-30 19:41:37
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,gen=3;
namespace math{
	// fast power , (x and ans) must in [-mod,mod], y must in [-mod+1,mod-1] 
	typedef long long i64;
	typedef unsigned long long u64;
	template<typename T=int>
	inline T fsp(i64 x,int y,i64 ans=1){
		for(y<0?y+=mod-1:0;y;y>>=1,x=x*x%mod)
			y&1?ans=ans*x%mod:0;
		return ans;
	}
	namespace fast_number_theory_transform{
		const int maxbit=22;
		// i64 mod_root[maxbit+1]; // mod_root[i]**(2**i) == 1
		// i64 mod_iroot[maxbit+1]; // mod_iroot[i]*mod_root[i] == 1

		// __attribute__((constructor))
		// inline void init_mod_root(){
		// 	mod_root[maxbit]=fsp(gen,mod>>(maxbit+1));
		// 	mod_iroot[maxbit]=fsp(mod_root[maxbit],mod-2);
		// 	for(int i=maxbit;i-->0;)
		// 		mod_root[i]=mod_root[i+1]*mod_root[i+1]%mod,
		// 		mod_iroot[i]=mod_iroot[i+1]*mod_iroot[i+1]%mod;
		// }

		// butterfly transform
		// int rev[1<<24];
		template<class T>
		inline void butterfly(T* p,int bit) {
			for(unsigned i=0,j=0;i<(1u<<bit);i++){
				// j=rev[i]=(rev[i>>1]>>1)^((i&1)<<(bit-1));
				if(i>j)swap(p[i],p[j]);
				for(unsigned l=1u<<(bit-1);(j^=l)<l;l>>=1);
			}
		}
		int *_q0[maxbit+1],*_p0[maxbit+1],*_q1[maxbit+1],*_p1[maxbit+1];
		inline void prep(int bit){
			static int k=0;
			for(;k<bit;k++){
				int *p,*q,nl=1<<k;
				i64 g=fsp(3,mod>>(k+1));
				p=_p0[k]=new int[nl];
				for(int i=p[0]=1;i<nl;i++)p[i]=p[i-1]*g%mod;
				butterfly(p,k);
				q=_q0[k]=new int[nl];
				for(int i=0;i<nl;i++)q[i]=(i64(p[i])<<32)/mod;
				g=fsp(g,-1);
				p=_p1[k]=new int[nl];
				for(int i=p[0]=1;i<nl;i++)p[i]=p[i-1]*g%mod;
				butterfly(p,k);
				q=_q1[k]=new int[nl];
				for(int i=0;i<nl;i++)q[i]=(i64(p[i])<<32)/mod;
			}
		}
		inline int ntt_mul(int x,i64 p,i64 q){
			int y=x*p-(q*x>>32)*mod;
			return y<mod?y:y-mod;
		}
		void ntt(int* a,int bit,bool f=0){
			prep(bit);
			int lim=1<<bit;
			for(int k=bit;k-->0;){
				int *_p=_p0[bit-k-1],*_q=_q0[bit-k-1];
				int *_a0=a,*_a1=a+(1<<k);
				for(int i=0;i<1<<(bit-k-1);i++,_a0+=1<<(k+1),_a1+=1<<(k+1))
					for(int j=0;j<(1<<k);++j){
						int x=_a0[j],y=ntt_mul(_a1[j],_p[i],_q[i]);
						(_a0[j]+=y)<mod?0:_a0[j]-=mod;
						(_a1[j]=x-y)<0?_a1[j]+=mod:0;
						// us u=xa[j]-(xa[j]>=us(MOD+MOD))*us(MOD+MOD);
						// us v=my_mul(xb[j],p[i],q[i]);
						// xa[j]=u+v;
						// xb[j]=u-v+us(MOD+MOD);
					}
				// i64 pw=1;
				// for(int j=0;j<(1<<k)-1;j++,pw=pw*mod_root[k]%mod){
				// 	for(int i=j;i<lim;i+=1<<(k+1)){
				// 		int x=a[i],&y=a[i^(1<<k)];
				// 		(a[i]+=y)<mod?0:a[i]-=mod;
				// 		y=pw*(x+mod-y)%mod;
				// 	}
				// }
				// for(int i=(1<<k)-1;i<lim;i+=1<<(k+1)){
				// 	int x=a[i],&y=a[i^(1<<k)];
				// 	(a[i]+=y)<mod?0:a[i]-=mod;
				// 	y=pw*(x+mod-y)%mod;
				// }
			}if(f)butterfly(a,bit);
		}
		
		void intt(int* a,int bit,bool f=0){
			prep(bit);
			if(f)butterfly(a,bit);
			int lim=1<<bit;
			for(int k=0;k<bit;k++){
				int *_p=_p1[bit-k-1],*_q=_q1[bit-k-1];
				int *_a0=a,*_a1=a+(1<<k);
				for(int i=0;i<1<<(bit-k-1);i++,_a0+=1<<(k+1),_a1+=1<<(k+1))
					for(int j=0;j<(1<<k);++j){
						int x=_a0[j],&y=_a1[j];
						(_a0[j]+=y)<mod?0:_a0[j]-=mod;
						y=ntt_mul(x+mod-y,_p[i],_q[i]);
					}
			}
			i64 iv=mod;iv<<=bit;iv=(iv-mod+1)>>bit;
			for(int i=0;i<lim;i++)
				a[i]=a[i]*iv%mod;
		}
	}using fast_number_theory_transform::ntt;
	using fast_number_theory_transform::intt;
}
using math::fsp;
using math::ntt;
using math::intt;
int f[1<<21],g[1<<21];
void poly_multiply(unsigned *a, int n, unsigned *b, int m, unsigned *c){
	int bit=__lg(n+m)+1;
	memcpy(f,a,4*(n+1));
	memcpy(g,b,4*(m+1));
	ntt(f,bit);ntt(g,bit);
	for(int i=0;i<(1<<bit);i++)f[i]=1ll*f[i]*g[i]%mod;
	intt(f,bit);
	memcpy(c,f,4*(n+m+1));
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1215.298 ms55 MB + 684 KBWrong AnswerScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-03-18 04:17:17 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠