对于 EI K 逆序对排列计数的另一种自然求和方法的理解
有一个简单的 \(O(n^3)\) DP,考虑 \(f_{x + 1, k} = \sum_{j = 0}^{x} f_{x, k - j}\),利用前缀和优化即可。
考虑这实际上是 \(f_{x + 1}(k) = f_x(k) * \frac {1 - k^{x + 1}}{1 - k}\),于是答案实际上为:
\]
接下来的方法来自 EI
,大力膜拜,这里稍稍细致展开。
考虑加入哑元 \(t\),也就是看似没有用的一个元:
\]
有一个重要的观察是:
\]
因此有 \((1 - xt) f(xt) = (1 - x^{n + 1}t) f(t)\)。
有一个关键的等式:
\]
考虑 \([t^m] f(t)\) 是由某 \(k\) 个 \(x^i t\) 选来,现在每一个 \(t\) 都多来了一个 \(x\),那么自然就多了 \(m\) 个 \(x\),于是得到了上式。
考虑设 \(f_m = [t^m] f(x)\),也就是此时将 \(f\) 看作一个关于 \(t\) 的多项式,而系数 \(f_m\) 实际上一个关于 \(x\) 的多项式。
我们在 \((1 - xt) f(xt) = (1 - x^{n + 1}t) f(t)\) 对两边同时取 \([t^m]\),可以得到:
[t^m] f(xt) - [t^m] xt f(xt) &= [t^m] f(t) - [t^m] x^{n + 1} t f(t) \\
x^m f_m - x \times x^{m - 1} f_{m- 1} &= f_m - x^{n + 1} f_{m - 1} \\
(x^m - 1) f_m &= (x^{n + 1} - x^m) f_{m - 1} \\
f_m &= -x^m \frac {1 - x^{n - m + 1}}{1 - x^m} f_{m - 1}
\end{aligned}
\]
现在我们考虑如何维护这个函数。
考虑 \(\frac 1 {1 - x^m} = \sum_k x^{km}\),实际上是对于 \(f_{m - 1}\) 做一个间隔为 \(m\) 的前缀和。
考虑 \(1 - x^{n - m + 1}\) 就是 \(f_m(x) \leftarrow f_m(x) - f_m(x - (n - m + 1)\) 即可。
于是考虑 \(g_m = \frac {1 - x^{n - m + 1}}{1 - x^m} g_{m - 1}\),那么
\]
\(g\) 是好维护的,最终答案为 \(\sum [x^k] f_m = \sum [x^{k - \frac {m(m + 1)}{2}}] (-1)^m g_m\),发现当 \(m \gt \sqrt k\) 的时候就没有值了,所以只需要维护 \(O(\sqrt k)\) 次卷积,每次是 \(O(k)\) 的,非常优秀。
对于 EI K 逆序对排列计数的另一种自然求和方法的理解的更多相关文章
- [luogu2513 HAOI2009] 逆序对数列 (计数dp)
题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? ...
- 1523. K-inversions(K逆序对)
1523 这题应该说有一些DP的思想吧 dp[i][j]表示以i为结尾第j个数的个数 k单调下降 直接求的话肯定超时 然后用树状数组来进行维护 求k-1次树状数组 #include <iostr ...
- 1523. K-inversions URAL 求k逆序对,,,,DP加树状数组
1523. K-inversions Time limit: 1.0 secondMemory limit: 64 MB Consider a permutation a1, a2, …, an (a ...
- hihoCoder_二分·归并排序之逆序对
一.题目 题目1 : 二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 在上一回.上上回以及上上上回里我们知道Nettle在玩<艦これ&g ...
- 【BZOJ4517】[Sdoi2016]排列计数 组合数+错排
[BZOJ4517][Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值 ...
- BZOJ4517 Sdoi2016 排列计数 【DP+组合计数】*
BZOJ4517 Sdoi2016 排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 ...
- SPOJ:Another Version of Inversion(二维数组的逆序对)
DCE Coders admins are way much geekier than they actually seem! Kartik has been following that tradi ...
- BZOJ 4517: [Sdoi2016]排列计数 错排+逆元
4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i, ...
- Leetcode 629.K个逆序对数组
K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 ...
- Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
随机推荐
- Django框架——ORM执行SQL语句、神奇的双下划线、外键字段的创建、跨表查询、进阶操作
ORM执行SQL语句 有时候ORM的操作效率可能偏低 我们是可以自己编写SQL的 方式一: models.User.objects.raw('select * from app01_user') 方式 ...
- SQL case when then end
SQL case when then end sql中的返回值可以使用case when then end来进行实现 SELECT s.s_id, CASE s.s_name WHEN '1' THE ...
- Scheduled SQL: SLS 大规模日志上的全局分析与调度
简介: 本文总结了大规模日志全局分析的需求,讨论SLS上现有的典型分析方案,并延伸到 SLS 原生数据处理方案,介绍 Schedueld SQL 功能与最佳实践. 大规模日志全局分析的需求 数据大规模 ...
- 使用 DISM 安全清理 C 盘 WinSxS 文件夹空间
本文将介绍如何使用系统内置 DISM 工具进行安全清理 C 盘空间,清理 WinSxS 文件夹里面的可回收删除的程序包空间 开始之前,先使用管理员权限打开 CMD 或 PowerShell 命令行窗口 ...
- kubenetes1.26中安装kubesphere3.4版本
一.安装前环境准备 # kubesphere官网:https://kubesphere.io/zh/docs/v3.4/introduction/what-is-kubesphere/ # 1.kub ...
- Canvas简历编辑器-我的剪贴板里究竟有什么数据
Canvas图形编辑器-我的剪贴板里究竟有什么数据 在这里我们先来聊聊我们究竟应该如何操作剪贴板,也就是我们在浏览器的复制粘贴事件,并且在此基础上聊聊我们在Canvas图形编辑器中应该如何控制焦点以及 ...
- JAVA基础-流程控制、字符串
一.java基础 1.java主类结构 package com.study.again001; 包名public class helloword { 类名 static String s1 = &qu ...
- lodash中的深拷贝方法cloneDeep()
- 2020版IDEA配置Tomcat 10出现卡主问题
问题描述 配置了2020版的IDE和Tomcat,但是产生了,日志打印中途,卡住了的问题,如图: 18-Aug-2021 00:46:09.763 信息 [main] org.apache.catal ...
- 有隙可乘 - Android 序列化漏洞分析实战
作者:vivo 互联网大前端团队 - Ma Lian 本文主要描述了FileProvider,startAnyWhere实现,Parcel不对称漏洞以及这三者结合产生的漏洞利用实战,另外阐述了漏洞利用 ...