样例输出1254,怎么会是呢?
查看原帖
样例输出1254,怎么会是呢?
442615
zhao2008楼主2024/1/27 22:22

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2.5e6+5,P=998244353;
int n,m,t[N];
ll a[N],b[N],invn,inv3;
ll qpow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=res*a%P;
		a=a*a%P,b>>=1;
	}
	return res;
}
void ntt(ll *f,int flag){
	for(int i=0;i<n;i++)
		if(i<t[i]) swap(f[i],f[t[i]]);
	for(int Len=2;Len<=n;Len<<=1){
		int len=Len>>1;
		ll sav=qpow(flag?3:inv3,(P-1)/Len);
		for(int l=0;l<n;l+=Len){
			ll buf=1;
			for(int i=l;i<l+len;i++){
				ll tmp=buf*f[i+len]%P;
				f[i+len]=(f[i]-tmp+P)%P,f[i]=(f[i]+tmp)%P;
				buf=buf*sav%P;
			}
		}
	}
	if(flag==1) return;
}
int main(){
	cin>>n>>m;
	for(int i=0;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=0;i<=m;i++)
		scanf("%lld",&b[i]);
	for(m+=n,n=1;n<=m;n<<=1);
	for(int i=0;i<n;i++)
		t[i]=(t[i>>1]>>1)|(i&1?n>>1:0);
	inv3=qpow(3,P-2),invn=qpow(n,P-2);
	ntt(a,1),ntt(b,1);
	for(int i=0;i<n;i++)
		a[i]=a[i]*b[i]%P;
	ntt(a,-1);
	for(int i=0;i<=m;i++)
		printf("%lld ",a[i]*invn%P);
	return 0;
}
2024/1/27 22:22
加载中...