传送门

学习了一下大佬的->这里

已知多项式$A(x)$,若存在$A(x)B(x)\equiv 1\pmod{x^n}$

则称$B(x)$为$A(x)$在模$x^n$下的逆元,记做$A^{-1}(x)$

具体的来说的话,就是两个多项式$A,B$相乘模$x^n$之后,所有次数大于等于$n$的项都没了,那么只有在剩下的项相乘之后未知数项全被消掉只留下一个常数项$1$时,$B$才是$A$的逆元

然后为什么要有模$x^n$的限制呢?因为没有这个限制的话,$B$可能有无穷多项

然后我们考虑如何计算$B(x)$

当$n=1$的时候,$A(x)\equiv c\pmod{x}$,其中$c$为常数项,那么$A^{-1}(x)$就是$c^{-1}$

当$n>1$时$$B(x)A(x)\equiv 1\pmod{x^n}$$

设$B'(x)$是模$x^{\left\lceil\frac{n}{2}\right\rceil}$时的逆元,即$$B'(x)A(x)\equiv 1\pmod{x^{\left\lceil\frac{n}{2}\right\rceil}}$$

首先,可以肯定$$B(x)A(x)\equiv 1\pmod{x^{\left\lceil\frac{n}{2}\right\rceil}}$$

那么上下两个式子相减可得$$B(x)-B'(x)\equiv 0\pmod{{x^{\left\lceil\frac{n}{2}\right\rceil}}}$$

然后两边平方$$B^2(x)-2B'(x)B(x)+B'^2(x)\equiv 0\pmod{{x^n}}$$

为什么上面模数变成$x^n$呢?我们考虑如果一个多项式在$\pmod{x^n}$的情况下为$0$,那么说明$0$到$n-1$项的系数也为$0$,它平方之后$0$到$2n-1$项系数$a_i$为$\sum_{j=0}^ia_ja_{i-j}$,那么$j$和$i-j$中必有一个小于$n$,也就是说$a_j$和$a_{i-j}$里必有一个为$0$,那么$a_i$也是$0$,所以平方之后在$\mod{2n}$也为$0$

然后在上式两边同乘$A(x)$并移项可得$$B(x)\equiv2B'(x)-A(x)B'^2(x)\pmod{x^n}$$

那么发现这个东西可以递归计算,时间复杂度为$O(nlogn)$

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define swap(x,y) (x^=y,y^=x,x^=y)
 6 #define mul(x,y) (1ll*x*y%P)
 7 #define add(x,y) (x+y>=P?x+y-P:x+y)
 8 #define dec(x,y) (x-y<0?x-y+P:x-y)
 9 using namespace std;
10 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
11 char buf[1<<21],*p1=buf,*p2=buf;
12 inline int read(){
13     #define num ch-'0'
14     char ch;bool flag=0;int res;
15     while(!isdigit(ch=getc()))
16     (ch=='-')&&(flag=true);
17     for(res=num;isdigit(ch=getc());res=res*10+num);
18     (flag)&&(res=-res);
19     #undef num
20     return res;
21 }
22 char sr[1<<21],z[20];int C=-1,Z;
23 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
24 inline void print(int x){
25     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
26     while(z[++Z]=x%10+48,x/=10);
27     while(sr[++C]=z[Z],--Z);sr[++C]=' ';
28 }
29 const int N=(1<<21)+5,P=998244353,G=3,Gi=332748118;
30 inline int ksm(int a,int b){
31     int res=1;
32     while(b){
33         if(b&1) res=mul(res,a);
34         a=mul(a,a),b>>=1;
35     }
36     return res;
37 }
38 int n,r[N],X[N],Y[N],A[N],B[N],O[N];
39 void NTT(int *A,int type,int len){
40     int limit=1,l=0;
41     while(limit<len) limit<<=1,++l;
42     for(int i=0;i<limit;++i)
43     r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
44     for(int i=0;i<limit;++i)
45     if(i<r[i]) swap(A[i],A[r[i]]);
46     for(int mid=1;mid<limit;mid<<=1){
47         int R=mid<<1,Wn=ksm(G,(P-1)/R);O[0]=1;
48         for(int j=1;j<mid;++j) O[j]=mul(O[j-1],Wn);
49         for(int j=0;j<limit;j+=R){
50             for(int k=0;k<mid;++k){
51                 int x=A[j+k],y=mul(O[k],A[j+k+mid]);
52                 A[j+k]=add(x,y),A[j+k+mid]=dec(x,y);
53             }
54         }
55     }
56     if(type==-1){
57         //这里这么写是因为如果要点值转系数直接reverse再除以n(也就是乘个逆元)就好了
58         reverse(A+1,A+limit);
59         for(int i=0,inv=ksm(limit,P-2);i<limit;++i)
60         A[i]=mul(A[i],inv);
61     }
62 }
63 void work(int *a,int *b,int len){
64     if(len==1) return (void)(b[0]=ksm(a[0],P-2));
65     work(a,b,len>>1);
66     for(int i=0;i<len;++i) A[i]=a[i],B[i]=b[i];
67     NTT(A,1,len<<1),NTT(B,1,len<<1);
68     for(int i=0;i<(len<<1);++i)
69     A[i]=mul(mul(A[i],B[i]),B[i]);
70     NTT(A,-1,len<<1);
71     for(int i=0;i<len;++i) b[i]=(1ll*(b[i]<<1)%P+P-A[i])%P;
72 }
73 int main(){
74 //    freopen("testdata.in","r",stdin);
75     n=read();
76     for(int i=0;i<n;++i) X[i]=(read()+P)%P;
77     int len;for(len=1;len<n;len<<=1);
78     work(X,Y,len);
79     for(int i=0;i<n;++i) print(Y[i]);
80     Ot();
81     return 0;
82 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9743310.html

洛谷P4238 【模板】多项式求逆(NTT)相关推荐

  1. 【BZOJ 4555】[Tjoi2016Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0 用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O( ...

  2. 洛谷P4239 【模板】多项式求逆(加强版)(多项式求逆)

    传送门 咱用的是拆系数\(FFT\)因为咱真的不会三模数\(NTT\)-- 简单来说就是把每一次多项式乘法都改成拆系数\(FFT\)就行了 如果您还不会多项式求逆的左转->这里 顺带一提,因为求 ...

  3. luogu P4238 多项式求逆 (模板题、FFT)

    luogu P4238 多项式求逆 (模板题.FFT) 手动博客搬家: 本文发表于20181125 13:21:46, 原地址https://blog.csdn.net/suncongbo/artic ...

  4. 洛谷P4233 射命丸文的笔记 【多项式求逆】

    题目链接 洛谷P4233 题解 我们只需求出总的哈密顿回路个数和总的强联通竞赛图个数 对于每条哈密顿回路,我们统计其贡献 一条哈密顿回路就是一个圆排列,有\(\frac{n!}{n}\)种,剩余边随便 ...

  5. 【洛谷P4233】— 射命丸文的笔记(竞赛图+多项式求逆)

    传送门 考虑强连通竞赛图哈密顿回路总数很好求 为(n−1)!2(n2)−n(n-1)!2^{{n\choose 2}-n}(n−1)!2(2n​)−n 现在问题是求强连通竞赛图数 设fif_ifi​为 ...

  6. luogu P4512 多项式除法 (模板题、FFT、多项式求逆)

    luogu P4512 多项式除法 (模板题.FFT.多项式求逆) 手动博客搬家: 本文发表于20181206 14:42:53, 原地址https://blog.csdn.net/suncongbo ...

  7. luogu P4726 多项式指数函数(模板题FFT、多项式求逆、多项式对数函数)

    luogu P4726 多项式指数函数(模板题FFT.多项式求逆.多项式对数函数) 手动博客搬家: 本文发表于20181127 08:39:42, 原地址https://blog.csdn.net/s ...

  8. luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)

    luogu P4725 多项式对数函数 (模板题.FFT.多项式求逆.求导和积分) 手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/s ...

  9. P4233-射命丸文的笔记【NTT,多项式求逆】

    正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的nnn个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个n∈[1 ...

  10. 【学习笔记】超简单的多项式求逆(含全套证明)

    整理的算法模板合集: ACM模板 目录 多项式求逆 一.分治FFT 二.倍增法及其证明 三.多项式求逆例题 P4238 [模板]多项式乘法逆 点我看多项式全家桶(●^◡_◡◡​^●) 多项式求逆 一. ...

最新文章

  1. 长沙望城:当好“贴心人” 扎牢“人民根” 坚守“云阵地”
  2. mezzanine安装配置
  3. 一个nuxt(vue)+mongoose全栈项目聊聊我粗浅的项目架构
  4. 会出现 unreachable statement 的可能
  5. linux---基础03
  6. 计算机视觉中的特征提取方式
  7. 在容器服务kubernetes上配置https
  8. linux服务器测网速,linux服务器如何测试网速
  9. 搭建一个 nodejs 脚手架
  10. 【JCC技术】JCC功能演示
  11. CSS如何进行图片定位
  12. 从TikTok功能优化,抓住直播带货机遇
  13. Soul App打造社交元宇宙,打破次元壁
  14. ubuntu如何安装及卸载mysql服务详细教程-图文版
  15. 关于Unity LitJson写入数据报错的问题
  16. Leetcode2057. 值相等的最小索引
  17. 网易七鱼在线客服系统web端对接
  18. 如何解除税务异常(列入黑名单)处理?
  19. 平面设计学习之路之二(PS-快捷键)
  20. 反洗钱检验java_从Drools规则引擎到风控反洗钱系统V0.2.3.pdf

热门文章

  1. BugkuCTF-Reverse题SafeBox(NJCTF)
  2. BugkuCTF-Reverse题signin
  3. java访问错误404_如何解决 Java web 项目中的 404 错误
  4. java jnotify_Jnotify文件监控的用法以及Jar文件导入的方法
  5. 云服务器BBC销售渠道,云服务器BBC控制台
  6. mysql 实例启动利用binlog恢复_mysql利用binlog进行数据恢复
  7. php头尾分离,laravel怎么做模板的头尾分离
  8. android 活动传递数据,如何在Android应用程序的“活动”之间传递数据?
  9. 银联分账与银联代付_第三方分账系统到底有哪些作用?
  10. pandas mysql index_Pandas从入门到精通(3)- Pandas多级索引MultiIndex