居家必备多项式板子
常用的多项式操作都在这。MTT啥的就算了(
NTT +多项式逆+开根(\(f[0]=1\))+带余除法+求导+积分+ ln + exp +多项式快速幂(\(f[0]=1\))+分治NTT
+下降幂与点值互转
#include
#define int long long
#define pc(x) putchar(x)
#define clr(f,n) memset(f,0,sizeof(int)*n)
#define cpy(f,g,n) memcpy(f,g,sizeof(int)*n)
#define rev(f,n) reverse(f,f+n)
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){f=ch=='-'?-1:f;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void write(int x)
{
if(x<0){x=-x;pc('-');}
if(x>9)write(x/10);
pc(x%10+48);
}
void polywrite(int *f,int n){for(int i=0;i>=1;
}return res;
}
int inv(int x){return qpow(x,mod-2);}//普通逆元
int n,m,k,f[maxn],g[maxn],tr[maxn];
int jc[maxn],iv[maxn];
const int invG=inv(G);
void pref(int n){for(int i=0;i>1]>>1)|((i&1)?n>>1:0);}//初始化
void NTT(int *f,bool op,int n)//逆天天
{
pref(n);
for(int i=0;i>1;
int tG=qpow(op?G:invG,(mod-1)/p);
for(int k=0;k>1;
cpy(sav,f,p);cpy(w,r,len);
NTT(sav,1,p);NTT(w,1,p);
px(sav,w,p);NTT(sav,0,p);
clr(sav,len);cpy(w,r,p);
NTT(sav,1,p);NTT(w,1,p);
px(sav,w,p);NTT(sav,0,p);
for(int i=len;i>1;
for(int i=0;i=1;--i)
f[i]=f[i-1]*iv[i]%mod;
f[0]=0;
}
void lnf(int *f,int m)//ln
{
static int sav[maxn];
cpy(sav,f,m);invf(sav,m);
deriv(f,m);mul(f,sav,m,m);
integ(f,m);clr(sav,m);
}
void expf(int *f,int m)//exp
{
static int sav[maxn],s[maxn];
int n;for(n=1;n>1)=r)return;
int mid=(l+r)>>1,n=r-l;
cdq(l,mid);
cpy(f1,g+l,n/2);clr(f1+n/2,n/2);
NTT(f1,1,n);px(f1,f2+n,n);NTT(f1,0,n);
for(int i=n/2;i