不是很懂。
查看原帖
不是很懂。
225100
LargeRice16pro楼主2023/11/9 11:38

把 ntt 放到 struct 里直接 TLE 了,不放进去最后一个点 400ms

#include<bits/stdc++.h>
// #pragma GCC optimize ("O2")
#define int long long
#define For(i,a,b) for(i=a;i<=b;i++)
#define FOR(i,a,b) for(i=a;i>=b;i--)
#define pb push_back
using namespace std;
const int N=4e6+10;
int a[N],b[N],g[N];
struct Poly{
	int mod=998244353,G=3,inv_G=332748118;
	int rev[N];
	int qz(int x,int y){
		int res=1;
		for(;y;y>>=1){
			if(y&1) res=res*x%mod;
			x=x*x%mod;
		}
		return res;
	}
	void ntt(int a[],int sign,int tot){
		int i,j,mid;
		For(i,0,tot-1) if(i<rev[i]) swap(a[i],a[rev[i]]);
		for(mid=1;mid<tot;mid<<=1){
			auto g1=qz(G,(mod-1)/(mid<<1));
			if(sign==-1) g1=qz(inv_G,(mod-1)/(mid<<1));
			for(i=0;i<tot;i+=(mid<<1)){
				auto gk=1; 
				for(j=0;j<mid;j++,gk=gk*g1%mod){
					auto x=a[i+j],y=gk*a[i+j+mid]%mod;
					a[i+j]=(x+y)%mod,a[i+j+mid]=(x-y+mod)%mod;
				}
			}
		}
		int inv=qz(tot,mod-2);
		if(sign==-1) For(i,0,tot-1) a[i]=a[i]*inv%mod;
	}
	void mul(int a[],int n,int b[],int m,int c[]){
		int i,tot=0,bit=0;
		while((1<<bit)<=n+m) bit++;
		tot=1<<bit;
		For(i,0,tot-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
		ntt(a,1,tot),ntt(b,1,tot);
		For(i,0,tot-1) c[i]=a[i]*b[i]%mod;
		ntt(c,-1,tot);
	}
}ntt;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n,m,i;
	cin>>n>>m;
	For(i,0,n) cin>>a[i];
	For(i,0,m) cin>>b[i];
	ntt.mul(a,n,b,m,g);
	For(i,0,n+m) cout<<g[i]<<' ';
	return 0;
}
2023/11/9 11:38
加载中...