如何在不能求逆的时候做子集卷积 exp(即便能求逆也比常见方法优雅)
为什么要求逆?正常做子集卷积 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 的式子。
对于喜欢代数推导的人:
把集合幂级数视为一个 \(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(即便能求逆也比常见方法优雅)的更多相关文章
- 牛顿迭代,多项式求逆,除法,开方,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 ... 
- RSA简介(四)——求逆算法
		此处所谓求逆运算,是指在模乘群里求逆. 第一节里提到互质的两个定义: (1)p,q两整数互质指p,q的最大公约数为1. (2)p.q两整数互质指存在整数a,b,使得ap+bq=1. 只要明白了欧几里得 ... 
- [总结]多项式求逆代替分治 $\text{FFT}$
		目录 问题提出 求逆代替分治 代码实现 由于我懒得不想学蠢得学不会分治 \(\text{FFT}\) ,发现可以用多项式求逆来完整地代替... 文章节选自分治 FFT 与多项式求逆,转载方便自己查看. ... 
- 树状数组 && 线段树应用 -- 求逆序数
		参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ... 
- Time Limit Exceeded 求逆序对数。
		/** 题目:Time Limit Exceeded 链接:https://oj.ejq.me/problem/28 题意:求逆序对数. 思路:树状数组求逆序对数.维护前面有多少个<=当前数的数 ... 
- [模板]多项式全家桶小记(求逆,开根,ln,exp)
		前言 这里的全家桶目前只包括了\(ln,exp,sqrt\).还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,\(NTT\)这种前置知识这里不多说. 还有一些基本的导数和微积分内容要了解,建 ... 
- HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ... 
- BNU 2418 Ultra-QuickSort (线段树求逆序对)
		题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ... 
- 树状数组求逆序对:POJ 2299、3067
		前几天开始看树状数组了,然后开始找题来刷. 首先是 POJ 2299 Ultra-QuickSort: http://poj.org/problem?id=2299 这题是指给你一个无序序列,只能交换 ... 
- wikioi 1688 求逆序对
		/*=========================================================== wikioi 1688 求逆序对 时间限制: 1 s 空间限制: 12800 ... 
随机推荐
- 推荐一款轻量级堡垒机系统让你防护“rm -rf 删库跑路”
			大家好,我是 Java陈序员. 我们在开发工作中,会经常与服务器打交道,而服务器的资源又是十分宝贵,特别是服务器里面的数据资源. 但是,偶尔会经常因为疏忽而导致服务器数据资源丢失,给自己和公司带来巨大 ... 
- Solution - AGC060C
			Link 简要题意:称一个长为 \(2^n-1\) 的排列 \(P\) 像堆,如果 \(P_i \lt P_{2i}\),且 \(P_i \lt P_{2i+1}\).给定 \(a,b\),设 \(u ... 
- 带你十天轻松搞定 Go 微服务系列全集+勘误
			官网手册: https://go-zero.dev/cn/ 文档说明: https://zhuanlan.zhihu.com/p/461604538 本地开发运行环境: https://github. ... 
- 09. C语言内嵌汇编代码
			C语言函数内可以自定义一段汇编代码,在GCC编译器中使用 asm 或 __asm__ 关键词定义一段汇编代码,并可选添加volatile关键字,表示不要让编译器优化这段汇编代码. 内嵌汇编代码格式如下 ... 
- C语言:if语句嵌套应用(小剧场)
			#include <stdio.h> int main() { int num,i; printf("一天Jackson.W打开了电脑想学习C语言\n"); print ... 
- Web3连接以太网
			1. Infura Infura 是一种托管服务,提供对各种区块链网络的安全可靠访问,消除了管理区块链基础设施的复杂性,使开发者能够专注于构建创新的 Web3 应用程序. Infura 作为连接应用程 ... 
- 什么是Java线程池
			摘自:某个百度知道 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在 ... 
- flask blinker信号
			Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1.内置信号 request_started = _ ... 
- Prism 基础知识学习(五)发布订阅
			Prism 基础知识学习(五)发布订阅 在 ViewBViewModel.cs中 1 public class ViewBViewModel : IDialogAware 2 { 3 /// < ... 
- itest(爱测试) 接口测试,敏捷测试管理平台 10.4.0 发布
			一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ... 
