为什么要求逆?正常做子集卷积 exp 的时候递推求 \(G=\exp(F)\) 的系数时要用。

什么情况下不能求逆?模 \(2^{64}\),或者压根不取模。

我们可能会想,算出来肯定除得尽啊,因为组合意义上是不会出现分数的。

并非如此,例如我们可能会尝试算 \(\exp(x)\cdot \exp(2x)\) 的 \([x^3]\) 处的系数乘上 \(3!\) 的结果,乘回来的结果肯定是整数,但运算过程中并不是。

考虑怎么绕开求逆。

对于喜欢组合意义的人:

假设我们对集合幂级数 \(F\) 做子集卷积 exp。

考虑第 \(n\) 个元素选或不选。如果不选,那么我们递归求出只考虑前 \(n-1\) 个元素的子集卷积 exp 的结果,记做 \(G_0\)。

如果选,那么考虑最终选出包含 \(n\) 的集合是哪个,设其为 \(S\),那么我们就是从 \(F\) 中选出一个包含 \(n\) 这个元素的集合 \(S\),再从 \(G_0\) 中选出一个集合 \(T\),贡献到 \(S\cup T\)。

这就是一个简单的子集卷积,可以 \(O(2^nn^2)\) 完成。

而总时间复杂度由递推式 \(T(n)=T(n-1)+O(2^nn^2)\) 计算,可以得到就是 \(O(2^nn^2)\) 的,和原来的复杂度一样,但是好写得多,因为不需要预处理逆元以及推一遍 n^2 求 exp 的式子。

对于喜欢代数推导的人:

原 CF Blog

把集合幂级数视为一个 \(n\) 元截断多项式 \(R(x_1,x_2,\dots,x_n)/(x_1^2,x_2^2,\dots,x_n^2)\)。

那么 \(G=\exp(F)\),\([x_n^0]G=\exp([x_n^0]F)\),\([x_n^1]G=[x_n^0]G[x_n^1]\exp(F)=[x_n^0]G[x_n^1]F\)。

所以我们只用递归求解 \([x_n^0]G\),就可以通过一次子集卷积求出 \([x_n^1]G\),两者拼接得到 \(G\)。

总时间复杂度由递推式 \(T(n)=T(n-1)+O(2^nn^2)\) 计算,可以得到就是 \(O(2^nn^2)\) 的,和原来的复杂度一样,但是好写得多,因为不需要预处理逆元以及推一遍 n^2 求 exp 的式子。

代码实现

这里是两种代码实现测速的地址

不用 vector 的话,简单来说,就一行:

G[0]=1; For(i,0,n-1) Conv(G,F+(1<<i),G+(1<<i),i);

其中 Conv(a,b,c,k) 表示对数组 a 和数组 b 做长为 k 的子集卷积,把结果放到 c 处。

如何在不能求逆的时候做子集卷积 exp(即便能求逆也比常见方法优雅)的更多相关文章

  1. 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂

    牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...

  2. RSA简介(四)——求逆算法

    此处所谓求逆运算,是指在模乘群里求逆. 第一节里提到互质的两个定义: (1)p,q两整数互质指p,q的最大公约数为1. (2)p.q两整数互质指存在整数a,b,使得ap+bq=1. 只要明白了欧几里得 ...

  3. [总结]多项式求逆代替分治 $\text{FFT}$

    目录 问题提出 求逆代替分治 代码实现 由于我懒得不想学蠢得学不会分治 \(\text{FFT}\) ,发现可以用多项式求逆来完整地代替... 文章节选自分治 FFT 与多项式求逆,转载方便自己查看. ...

  4. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  5. Time Limit Exceeded 求逆序对数。

    /** 题目:Time Limit Exceeded 链接:https://oj.ejq.me/problem/28 题意:求逆序对数. 思路:树状数组求逆序对数.维护前面有多少个<=当前数的数 ...

  6. [模板]多项式全家桶小记(求逆,开根,ln,exp)

    前言 这里的全家桶目前只包括了\(ln,exp,sqrt\).还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,\(NTT\)这种前置知识这里不多说. 还有一些基本的导数和微积分内容要了解,建 ...

  7. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

  8. BNU 2418 Ultra-QuickSort (线段树求逆序对)

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...

  9. 树状数组求逆序对:POJ 2299、3067

    前几天开始看树状数组了,然后开始找题来刷. 首先是 POJ 2299 Ultra-QuickSort: http://poj.org/problem?id=2299 这题是指给你一个无序序列,只能交换 ...

  10. wikioi 1688 求逆序对

    /*=========================================================== wikioi 1688 求逆序对 时间限制: 1 s 空间限制: 12800 ...

随机推荐

  1. 由初中生实现的 Windows 12 网页版!

    大家好,我是 Java陈序员. 这几天,逛 Github 的时候,看到了一个项目 win12 -- 仿 Windows12 网页版!被它实现的页面功能震撼到了,大家可以一起来感受下! 首先是登录页面. ...

  2. arduino uno+LCD12864(ST7735S)+蓝牙模块实现贪吃蛇

    1.前言: 1.1本实验实现的贪吃蛇能穿越边界,结束游戏的唯一条件是贪吃蛇到达指定长度 1.2本实验所用LCD可能不是LCD12864,LCD12864所用库为u8glib,笔者在词库中并没有找到型号 ...

  3. 14、web 中间件加固-Tomcat 加固

    1.用户配置 如果不需要控制台管理,请更改控制台用户文件注销账号信息:如果需要,请更改账户信息 修改 tomcat/conf/tomcat-user.xml 文件 注释或修改如下信息 <role ...

  4. 更新Homebrew时候遇到的问题

    问题描述: 更新Homebrew时候遇到无法访问github的问题,判定原因为DNS污Ran. fatal: unable to access 'https://github.com/Homebrew ...

  5. es请求方式调用

    Es基础 关系: ElasticSearch-> mysql index (索引)-> 数据库 Documents(文档) -> row(行) Fileds(字段)-> col ...

  6. Vue+springboot集成PageOffice实现在线编辑Word、excel文档

    说明: PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑Word.Excel.PowerPoint文档.可以完美实现在线公文流转,领导批阅,盖章.可 ...

  7. 异构数据源同步之数据同步 → datax 再改造,开始触及源码

    开心一刻 其实追女生,没那么复杂 只要你花心思,花时间,陪她聊天,带她吃好吃的,耍好玩的,买好看的 慢慢你就会发现什么叫做 打水漂 不说了,我要去陪她看电影了 前情回顾 异构数据源同步之数据同步 → ...

  8. golang 切片原理面试题

    package main import "fmt" func main() { var s = make([]int, 0, 10) _ = append(s, 1,2,3) fm ...

  9. Android 12(S) MultiMedia Learning(三)MediaPlayer Native

    上一篇MediaPlayer中看到实现一个最简单的播放器只需要5个接口,接下来会看看这些接口实现内容 /************************************************ ...

  10. Json.NET Converting between JSON and XML

    Json.NET supports converting JSON to XML and vice versa using the XmlNodeConverter. Elements, attrib ...