求助NTT
查看原帖
求助NTT
600441
ZhongYuLin楼主2024/7/27 20:52

数据得到不合理答案

5 5
1 7 4 0 9 4 
8 8 2 4 5 5 

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e6+3,P=998244353,G=3,INVG=332748118;
ll fp(ll a,ll b=P-2){ll ans=1;for(;b;b>>=1,a=a*a%P)if(b&1)ans=ans*a%P;return ans;}
int n,m;
vector<ll>a,b;
void NTT(vector<ll>&a,int n,bool typ){
	if(n==1)return;
	int m=n>>1;
	vector<ll>a0(m),a1(m);
	for(int i=0;i<m;++i){
		a0[i]=a[i<<1];
		a1[i]=a[i<<1|1];
	}
	NTT(a0,m,typ);NTT(a1,m,typ);
	ll del=fp(typ?G:INVG,(P-1)/m),at=1;
	for(int i=0;i<m;++i){
		a[i]=(a0[i]+at*a1[i]%P)%P;
		a[i+m]=(a0[i]-at*a1[i]%P+P)%P;
		at=at*del%P;
	}
}
void INTT(vector<ll>&a,int sz){
	NTT(a,sz,0);ll inv=fp(sz);
	reverse(&a[0],&a[sz-1]);
    for(int i=0;i<=sz;++i)
        a[i]=a[i]*inv%P;
}
int main(){
	int x,y,z,u,v,w;
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	int sz=1<<__lg(n+m)+1;
	a.resize(sz+3);b.resize(sz+3);
	for(int i=0;i<=n;++i)cin>>a[i];
	for(int i=0;i<=m;++i)cin>>b[i];
	NTT(a,sz,1);NTT(b,sz,1);
	for(int i=0;i<=sz;++i)
		a[i]=a[i]*b[i]%P;
	INTT(a,sz);
	for(int i=0;i<=n+m;++i)
		printf("%lld ",a[i]);
	puts("");
	return 0;
}
2024/7/27 20:52
加载中...