Re.多项式求逆
前言
emmm暂无
多项式求逆目的
顾名思义 就是求出一个多项式的摸xn时的逆
给定一个多项式F(x),请求出一个多项式G(x),满足F(x)∗G(x)≡1(modxn),系数对998244353取模。
多项式求逆主要思路
我们考虑用递推的做法
假设我们当前已知F(x)H(x)=1(mod xi/2)
要求的是F(x)Q(x)=1(mod xi)
因为F(x)Q(x)=1(mod xi)
所以F(x)Q(x)=1(mod xi/2)
可得F(x)(Q(x)-H(x))=0(mod xi/2)
显然可得Q(x)-H(x)=0(mod xi/2)
将上述式子两边平方得H(x)2-2Q(x)H(x)+Q(x)2=0(mod xi)
再将两边同时乘上F(x)
因为F(x)Q(x)=1(mod xi)
所以得F(x)H(x)2-2H(x)+Q(x)=0(mod xi)
移项最后得求的G(x)=2H(x)-F(x)H(x)2(mod xi)
那么就可以递推了
初始状态显然为i等于1的情况G(0)为F(0)的逆元
最后的递推式就为
1.if(x=0)-----G(0)=F(0)p-2(p为模数)
2.if(x>0)-----G(x)=2H(x)-F(x)H(x)2(mod xi)
代码
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define C getchar()-48
- inline ll read()
- {
- ll s=0,r=1;
- char c=C;
- for(;c<0||c>9;c=C) if(c==-3) r=-1;
- for(;c>=0&&c<=9;c=C) s=(s<<1)+(s<<3)+c;
- return s*r;
- }
- const ll p=998244353,G=3,N=2100000;
- ll n;
- ll rev[N];
- ll a[N],b[N],c[N];
- inline ll ksm(ll a,ll b)
- {
- ll ans=1;
- while(b)
- {
- if(b&1) ans=(ans*a)%p;
- a=(a*a)%p;
- b>>=1;
- }
- return ans;
- }
- inline void ntt(ll *a,ll n,ll kd)
- {
- for(ll i=0;i<n;i++)
- if(i<rev[i])
- swap(a[i],a[rev[i]]);
- for(ll i=1;i<n;i<<=1)
- {
- ll gn=ksm(G,(p-1)/(i<<1));
- for(ll j=0;j<n;j+=(i<<1))
- {
- ll t1,t2,g=1;
- for(ll k=0;k<i;k++,g=1ll*g*gn%p)
- {
- t1=a[j+k],t2=1ll*g*a[j+k+i]%p;
- a[j+k]=(t1+t2)%p,a[j+k+i]=(t1-t2+p)%p;
- }
- }
- }
- if(kd==1) return;
- ll ny=ksm(n,p-2);
- reverse(a+1,a+n);
- for(ll i=0;i<n;i++) a[i]=1ll*a[i]*ny%p;
- }
- inline void work(ll deg,ll *a,ll *b)
- {
- if(deg==1){b[0]=ksm(a[0],p-2);return;}
- work((deg+1)>>1,a,b);
- ll len=0,sum=1;
- for(;sum<(deg<<1);sum<<=1,len++);
- for(ll i=1;i<sum;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
- for(ll i=0;i<deg;i++) c[i]=a[i];
- for(ll i=deg;i<sum;i++) c[i]=0;
- ntt(c,sum,1);ntt(b,sum,1);
- for(ll i=0;i<sum;i++) b[i]=1ll*(2-1ll*c[i]*b[i]%p+p)%p*b[i]%p;
- ntt(b,sum,-1);
- for(ll i=deg;i<sum;i++) b[i]=0;
- }
- int main()
- {
- n=read();
- for(ll i=0;i<n;i++) a[i]=read();
- work(n,a,b);
- for(ll i=0;i<n;i++) printf("%lld ",b[i]);
- return 0;
- }
Re.多项式求逆的更多相关文章
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- NTT+多项式求逆+多项式开方(BZOJ3625)
定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...
- BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)
题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...
- 洛谷P4841 城市规划(生成函数 多项式求逆)
题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...
- LOJ2527 HAOI2018 染色 容斥、生成函数、多项式求逆
传送门 调了1h竟然是因为1004535809写成了998244353 "恰好有\(K\)种颜色出现了\(S\)次"的限制似乎并不容易达到,考虑容斥计算. 令\(c_j\)表示强制 ...
- 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆
题目大意 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots ,c_n\).如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合\(\{c_1,c_2,\ldots ,c_n\ ...
- 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂
题目大意 本题的满二叉树定义为:不存在只有一个儿子的节点的二叉树. 定义一棵满二叉树\(A\)包含满二叉树\(B\)当且经当\(A\)可以通过下列三种操作变成\(B\): 把一个节点的两个儿子同时删掉 ...
- 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln
题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...
随机推荐
- WEB前端学习资源清单
常用学习资源 JS参考与基础学习系列 [MDN]JS标准参考 es6教程 JS标准参考教程 编程类中文书籍索引 深入理解JS系列 前端开发仓库 <JavaScript 闯关记> JavaS ...
- EclipseAndroid打包签名发布安装失败闪退运行不了
EclipseAndroid打包签名发布安装失败闪退运行不了 本来没怎么用过用Eclipse写安卓,可是有人有需要必须用Eclipse写,那就写呗. 可在签名打包的时候,发到手机上安装,提示安装成功. ...
- Android 字体适配方案
开发过程中,按照UI设计尺寸做好UI页面,当用户自定义自己的手机字体大小之后UI完全没法看了,这个时候就在想让app字体大小始终一致就好了 下面看一下,出现的问题和解决方案 做个简单的例子,先 ...
- Android为TV端助力 电影栏目移动到底部或者顶部时抖动动画
1 移动到底部上下抖动ObjectAnimator animatorX = ObjectAnimator.ofFloat(holder.itemView,"translationX" ...
- Html5 Canvas介绍
1. 获取绘图上下文 var mycanvas = document.getElementById('mycanvas'); var context = mycanvas.getContext('2d ...
- 扫码下单与ERP客户端锁桌功能FAQ
一.需求场景:因为目前客户端和平台端有两套数据库,两套数据库通过网络交互信息,且双方都可以发起支付,这种结构容易造成: 1.一笔订单同时支付.一笔订单支付时未按最新订单进行支付,支付多付.支付少付的情 ...
- redis -hash(哈希.对象)
hash 用于储存对象,对象的结构为属性.值 值的类型string 增加.修改: 设置单个属性: hset 键 field 值 例如: 设置键 user 的属性name 为 python hset u ...
- mssql sqlserver with cte表达式(递归)找出最顶值的方法分享
摘要: 下文通过递归的方式找出最顶级部门的方法分享,如下所示: 实验环境:sql server 2008 R2 下文通过cte-with表达式实现递归,获取一个公司的顶级部门,如下所示 例:部门表 c ...
- Linux(一)—— Unix&Linux 历史
Linux(一)-- Unix&Linux 历史 Unix =Unix内核+Unix实用工具 Unix Unix 的诞生 Unix的历史可以追溯到20世纪60年代中期,当时麻省理工学院,AT& ...
- c++字节对齐编译器指令#pragma
第一种 #pragma pack(push, 1) // 先把当前对齐设置压栈,再设置为1字节对齐 struct S { char a; ]; }; #pragma pack(pop) // 恢复先前 ...