多项式全集
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
/*================Header Template==============*/
const int N=1e5+500;
vector<int>F,G;
int n,m;
/*==================Define Area================*/
namespace NTT {
const int Md=998244353;
inline int Add(const int &x,const int &y) {return (x+y)>=Md?(x+y-Md):(x+y);}
inline int Sub(const int &x,const int &y) {return (x-y)<0?(x-y+Md):(x-y);}
inline int Mul(const int &x,const int &y) {return (ll)x*y%Md;}
int Powe(int x,int y) {
int ans=1;
while(y) {
if(y&1) ans=Mul(ans,x);
x=Mul(x,x);
y>>=1;
}
return ans;
}
inline int Div(const int &x,const int &y) {return Mul(x,Powe(y,Md-2));}
int rev[N<<2|1];
vector<int>C;
void DFT(vector<int>&A,int len) {
for(int i=0;i<len;i++) if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int i=1;i<len;i<<=1) {
int wn=Powe(3,(Md-1)/(i<<1));
for(int j=0;j<len;j+=i<<1) {
int nw=1,x,y;
for(int k=0;k<i;k++,nw=Mul(nw,wn)) {
x=A[j+k],y=Mul(nw,A[i+j+k]);
A[j+k]=Add(x,y);A[i+j+k]=Sub(x,y);
}
}
}
}
void IDFT(vector<int>&A,int len) {
reverse(A.begin()+1,A.end());
int Inv=Powe(len,Md-2);
DFT(A,len);
for(int i=0;i<len;i++) A[i]=Mul(A[i],Inv);
}
vector<int> MUL(vector<int>A,vector<int>B) {
int len,n=A.size(),m=B.size();
for(len=1;len<n+m-1;len<<=1);
A.resize(len),B.resize(len);
for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
DFT(A,len);DFT(B,len);
for(int i=0;i<len;i++) A[i]=Mul(A[i],B[i]);
IDFT(A,len);
A.resize(n+m-1);
return A;
}
void GetInv(int Deg,vector<int>&A,vector<int>&B) {
if(Deg==1) {
B[0]=Powe(A[0],Md-2);
return ;
}
GetInv((Deg+1)>>1,A,B);
int len;
for(len=1;len<(Deg<<1);len<<=1);
for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
B.resize(len);C.clear();C.resize(len);
for(int i=0;i<Deg;i++) C[i]=A[i];
for(int i=Deg;i<len;i++) C[i]=0;
DFT(C,len);DFT(B,len);
for(int i=0;i<len;i++) {
B[i]=Mul(Sub(2,Mul(B[i],C[i])),B[i]);
}
IDFT(B,len);
for(int i=Deg;i<len;i++) B[i]=0;
}
}
int main() {
}