[模板] 多项式求逆

17人阅读 评论(0) 收藏 举报
分类:

题目描述:

给定多项式F(x)
求一个多项式G(x)
满足F(x)G(x)1(mod xn)

题目分析:

通过倍增法及NTT求逆
总复杂度为NlogN
具体讲解请看Miskcoo的博客

题目链接:

Luogu 4238

Ac 代码:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#define ll long long 
const int maxm=2e6+100,mod=998244353,g=3,gi=332748118;
ll A[maxm],B[maxm],C[maxm];
int rev[maxm],bin[1<<21];
inline int fastpow(ll x,int y)
{
    ll ans=1;
    for(;y;y>>=1,x=(x*x)%mod) if(y&1) ans=(ans*x)%mod;
    return ans%mod;
}
inline void NTT(ll *a,int n,int f)
{
    int l=bin[n];
    for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
    for(int i=0;i<n;i++) if(i<rev[i]) std::swap(a[i],a[rev[i]]);
    for(int i=1;i<n;i<<=1)
    {
        ll wn=fastpow((f==1)?g:gi,(mod-1)/(i<<1));
        for(int j=0;j<n;j+=(i<<1))
        {
            ll w=1;
            for(int k=0;k<i;k++,w=(w*wn)%mod)
            {
                ll x=a[j+k],y=(w*a[i+j+k])%mod;
                a[j+k]=(x+y)%mod;
                a[i+j+k]=(x-y+mod)%mod; 
            }
        }
    }
    if(f==-1) 
    {
        int inv=fastpow(n,mod-2);
        for(int i=0;i<n;i++) a[i]=(a[i]*inv)%mod;
    }
}
void getinv(ll *a,ll *b,int n)
{
    if(n==1)
    {
        b[0]=fastpow(a[0],mod-2);
        return;
    }
    getinv(a,b,(n+1)>>1);
    int m=1;
    for(;m<=n;m<<=1);
    for(int i=0;i<n;i++) C[i]=A[i];
    for(int i=n;i<m;i++) C[i]=0;
    NTT(C,m,1),NTT(B,m,1);
    for(int i=0;i<m;i++)
     B[i]=(2*B[i]%mod-C[i]*B[i]%mod*B[i]%mod+mod)%mod; 
    NTT(B,m,-1);
    for(int i=n;i<m;i++) B[i]=0;
}
int main()
{
    int n,m;
    for(int i=0;i<=19;i++) bin[1<<i]=i;
    scanf("%d",&n);
    for(m=1;m<=n;m<<=1);
    for(int i=0;i<n;i++) scanf("%lld",&A[i]);
    getinv(A,B,m);
    for(int i=0;i<n;i++) printf("%lld ",B[i]%mod);
    return 0;
}
查看评论

[多项式求逆 模板题] BZOJ 4555 [Tjoi2016&Heoi2016]求和

推导不多说了 在很久之前就写过了 观察柿子gn=∑i=1n2∗Cin∗gn−ig_n=\sum _{i=1}^n 2*C_n^i*g_{n-i} 写成卷积的形式 gnn!=∑i=1n2i!∗g...
  • u014609452
  • u014609452
  • 2017-02-21 18:19:42
  • 868

多项式求逆元模板

多项式求逆元具体概念及求法可见这里,本文主要提供模板。 本文提供的是模998244353下保留0~nn次项,即mod(xn+1)mod(x^{n+1})意义下的模板。 #include #defi...
  • cdsszjj
  • cdsszjj
  • 2018-01-15 22:54:50
  • 154

预处理伯努利数(多项式求逆)

伯努利数定义:  递推式: 将e^t展开得到: 然后就可以利用多项式逆元求出伯努利数了。。 多项式逆元就是给定一个n次多项式A(x),求另一个多项式B(x),满足 其中mod x^n表示多项式除...
  • u013654696
  • u013654696
  • 2015-09-22 23:02:23
  • 1199

洛谷P4238:【模板】多项式求逆

题目传送门:https://www.luogu.org/problemnew/show/P4238 题目分析:放个板子在blog上,以后复习的时候用。 注意每一次调用Poly_Rev()的时候...
  • KsCla
  • KsCla
  • 2018-02-25 01:08:10
  • 55

[Notes][多项式]杂记 · 多项式算法—多项式求逆 多项式取模 多项式开根…

多项式 由若干个单项式相加组成的代数式叫做多项式 形如:f(x)=∑ni=0aixif(x)=∑i=0naixif(x)=\sum_{i=0}^{n}a_ix^i, deg&amp;nbsp;f...
  • Coldef
  • Coldef
  • 2017-07-24 14:48:17
  • 1298

bzoj 4555:[Tjoi2016&Heoi2016]求和 多项式求逆

如果没有2^j和j!,那么题目就是求Σ(i=0,n)Bi(Bi表示第i个贝尔数),而Bi=Σ(j=0,i)S(i,j)。        考虑第二类斯特林数的含义为将i个不同的数分成j个集合的方案数,...
  • lych_cys
  • lych_cys
  • 2016-05-27 07:58:54
  • 2299

bzoj 3456: 城市规划 (NTT+多项式求逆)

题目描述传送门题目大意:求n个点简单无向连通图数,其中任意点之间可以随意连边,不存在重边和自环。题解设f[n]f[n]表示n个点简单连通图个数(即1所属的连通块内有n个点) f[n]=2(n−1)∗...
  • clover_hxy
  • clover_hxy
  • 2017-02-24 11:40:00
  • 656

[BZOJ4555][Tjoi2016&Heoi2016]求和-NTT-多项式求逆

求和Description在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ ...
  • zlttttt
  • zlttttt
  • 2018-01-13 00:16:42
  • 112

扩展欧几里得算法 有限域上多项式求逆

今年网络安全的一个小作业,简单用C++实现了下 有些粗糙 先放这儿吧 ^_^算法描述 考完试再附上ExEuclid简单实现/* * 文件名称:myecu.cpp * 摘 要:Extend Eucl...
  • Yibaini
  • Yibaini
  • 2010-07-06 16:03:00
  • 2916
    个人资料
    持之以恒
    等级:
    访问量: 6万+
    积分: 7157
    排名: 3954
    文章分类
    最新评论