居家必备多项式板子


常用的多项式操作都在这。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

相关