多项式开根号

引入

求出多项式是 满足 系数对一个数取模。

推导

还是利用牛顿迭代 。那么代入牛顿迭代的公式为 然后没有学习过牛顿迭代的朋友可以看我上一篇。

  • 当然这下面这份代码不能解决 的情况。那个时候应该使用二次剩余。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 4e6 + 100,P = 998244353;
int limit,r[N],L;
int ksm(int a,int b) {int x=1;for(;b;b>>=1,a=1LL*a*a%P)if(b&1)x=1LL*x*a%P;return x;}
void NTT(int *a,int type) {
    for(int i=0;i<limit;i++)if(i>r[i])swap(a[i],a[r[i]]);
    for(int mid=1;mid<limit;mid<<=1) {
        int wn=ksm(3,(P-1)/(mid<<1));for(int i=0;i<limit;i+=(mid<<1)){
            for(int j=0,w=1;j<mid;j++,w=1LL*w*wn%P) {
                int x=a[i+j],y=1LL*a[i+j+mid]*w%P;
                a[i+j]=(x+y)%P;a[i+j+mid]=(x-y+P)%P;
            }
        }
    }
    if(type==-1) {reverse(a+1,a+limit);int Inv=ksm(limit,P-2);for(int i=0;i<limit;i++)a[i]=1LL*a[i]*Inv%P;}
}
void Mul(int *f,int *g,int len) {
    static int G[N];
    memcpy(G,g,sizeof(G));
    NTT(f,1);NTT(g,1);
    for(int i = 0;i < limit;i++) f[i] = 1LL * f[i] * g[i] % P;
    NTT(f,-1);for(int i=len+1;i<limit;i++) f[i]=0;
}
void init(int len) {
    limit=1;L=0;while(limit<=len)limit<<=1,L++;
    for(int i=0;i<limit;i++)r[i]=(r[i>>1]>>1)|((i&1)<<L-1);
}
void GetInv(int *f,int *g,int n) {
    if(n==1) {g[0]=ksm(f[0],P-2);return;}
    GetInv(f,g,(n+1)>>1);
    init(n+n-2);
    static int c[N];memset(c,0,sizeof(c));
    for(int i = 0;i < n;i++) c[i] = f[i];
    NTT(c,1);NTT(g,1);
    for(int i = 0;i < limit;i++) g[i] = 1LL * g[i] * ((2LL - 1LL * c[i] * g[i] % P + P) % P) % P;
    NTT(g,-1);for(int i = n;i < limit;i++) g[i] = 0;
}
void Dao(int *f,int *g,int n) {
    for(int i = 1;i < n;i++) g[i-1]=1LL*f[i]*i%P;g[n-1]=0;
}
void JiFen(int *f,int *g,int n) {
    for(int i = 1;i < n;i++) g[i]=1LL*f[i-1]*ksm(i,P-2)%P;g[0]=0; 
}
void GetLn(int *f,int *g,int n) {
    static int A[N],B[N];memset(A,0,sizeof(A));memset(B,0,sizeof(B));
    Dao(f,A,n);GetInv(f,B,n);
    init(n+n-2);NTT(A,1);NTT(B,1);
    for(int i=0;i<limit;i++)A[i]=1LL*A[i]*B[i]%P;
    NTT(A,-1);JiFen(A,g,n);
}
void GetExp(int *f,int *g,int n) {
    if(n==1) {g[0]=1;return;}
    GetExp(f,g,(n+1)>>1);static int F[N];
    memset(F,0,sizeof(F));GetLn(g,F,n);
    F[0]=(1LL*f[0]+1-F[0]+P)%P;
    for(int i=1;i<n;i++)F[i]=(-1LL*F[i]+f[i]+P)%P;
    init(n+n-2);Mul(g,F,n-1);
}
void GetPow(int *f,int *g,int n,int K) {
    static int F[N];memset(F,0,sizeof(F));
    GetLn(f,F,n);
    for(int i=0;i<n;i++)F[i]=1LL*K*F[i]%P;
    GetExp(F,g,n);
}
int inv2;
void GetSqr(int *f,int *g,int n) {
    if(n==1) {g[0]=1;return;}
    GetSqr(f,g,(n+1)>>1);static int F[N],A[N];
    memset(F,0,sizeof(F));GetInv(g,F,n);
    memset(A,0,sizeof(A));for(int i=0;i<n;i++)A[i]=f[i];
    init(n+n-2);Mul(A,F,n-1);
    for(int i=0;i<n;i++)g[i]=(1LL*g[i]+A[i])%P*inv2%P;

}
int f[N],g[N];
int main() {
    int n;inv2=ksm(2,P-2);
    cin >> n;for(int i = 0;i < n;i++) cin >> f[i];
    GetSqr(f,g,n);
    for(int i = 0;i < n;i++) cout << g[i] << " ";
    return 0;
}
数学 文章被收录于专栏

关于多项式

全部评论
orzorz
点赞 回复 分享
发布于 2020-10-16 19:26

相关推荐

03-15 10:59
已编辑
美团_后端开发(实习员工)
爱写代码的菜code...:哎,自己当时拿到字节offer的时候也在感叹终于拿到了,自己当时最想去的企业就是字节,结果还是阴差阳错去了鹅厂。祝uu一切顺利!!!
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4251次浏览 75人参与
# AI面会问哪些问题? #
27505次浏览 550人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15088次浏览 221人参与
# 你的实习产出是真实的还是包装的? #
20041次浏览 342人参与
# 找AI工作可以去哪些公司? #
8935次浏览 230人参与
# 春招至今,你的战绩如何? #
64488次浏览 575人参与
# 米连集团26产品管培生项目 #
13292次浏览 285人参与
# 从事AI岗需要掌握哪些技术栈? #
8791次浏览 299人参与
# 你做过最难的笔试是哪家公司 #
33064次浏览 229人参与
# 中国电信笔试 #
31910次浏览 292人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340695次浏览 2173人参与
# 哪些公司真双非友好? #
69552次浏览 289人参与
# 阿里笔试 #
178352次浏览 1314人参与
# 机械人避雷的岗位/公司 #
62693次浏览 393人参与
# 第一份工作一定要去大厂吗 #
14405次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22047次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26231次浏览 310人参与
# 沪漂/北漂你觉得哪个更苦? #
9748次浏览 193人参与
# HR最不可信的一句话是__ #
6151次浏览 113人参与
# 应届生第一份工资要多少合适 #
20663次浏览 86人参与
# AI时代,哪个岗位还有“活路” #
11419次浏览 339人参与
# 春招你拿到offer了吗 #
831079次浏览 9986人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务