由于本文过长,\(\LaTeX\) 炸了,分两篇,part2

题目描述

定义一个正整数序列为好序列,当且仅当如果某个数 \(k\) 出现过,那么一定有 \(k-1\) 在最后一个 \(k\) 的前面出现过。

对于所有 \(i\in[1,n]\),求出 \(i\) 在所有好序列中出现次数的和

Easy Version:\(n\leq 5000\)

Hard Version:\(n\leq 10^5\)

题解

领略到了国际计数顶尖水平。。

问题转化

有重复元素的正整数序列不好统计,我们试图将它映射到排列上

我们构建一个排列 \(p\),在相邻两个数字之间填入不等号,设 \(p_{1\dots i}\) 中共有 \(num_i\) 个小于号,我们将它映射到 \(a\) 序列:\(a_{p_i}=num_i+1\),则 \(a\) 是一个好序列

证明如下:设 \(i\) 为一个小于号右边的位置,则 \(num_{i-1}+1=num_i\),即 \(a_{p_{i-1}}+1=a_{p_i}\),而由于是小于号,所以 \(p_{i-1}<p_i\),容易发现这正是题目中要求的限制

而对于一个好序列,我们从小到大枚举数值,对于每一个数值,我们将它所在的所有下标从大到小放到数列的后面(初始数列为空),这样我们就完成了从好序列到排列的映射

则容易发现,这是一个双射关系

排列组合推导

这里引入欧拉数:\(\left<\begin{matrix}n\\k\end{matrix}\right>\) 表示长度为 \(n\) 的排列中,相邻数字之间的小于号数目为 \(k\) 的方案数

设 \(ans_k\) 为数字 \(k+1\) 的答案

则 \(ans_k=\sum\limits_{i=\max(k,1)}^n\left<\begin{matrix}i\\k\end{matrix}\right>\dbinom ni(n-i)!\)

什么意思呢?我们枚举产生好序列中 \(k+1\) 这个数字的位置,则前 \(i\) 个数中需要有 \(k\) 个小于号,我们再给前 \(i\) 个数分配标号,剩下的 \(n-i\) 个数随意排列

可是这个算的是排列方案数,而且还算重了

我们考虑证明算重的次数就等于该方案中 \(k+1\) 的出现次数:对于一个排列,它被计算当且仅当 \(i\) 在第 \(k\) 个小于号和第 \(k+1\) 个小于号之间,而这恰好就是 \(k+1\) 的出现次数

\(O(n^2)\) 递推欧拉数即可通过 Easy Version

补一个欧拉数的递推公式:

考虑在长度为 \(n-1\) 的排列中插入一个 \(n\) 得到长度为 \(n\) 的排列

  • 在排列的左端插入一个 \(n\),这样不会增加小于号的数量,所以这种情况从 \(\left<\begin{matrix}n-1\\k\end{matrix}\right>\) 转移来
  • 在排列的右端插入一个 nn,这样会增加一个小于号,所以这种情况由 \(\left<\begin{matrix}n-1\\k-1\end{matrix}\right>\) 转移来
  • 在某一个位置 \(i\) 和 \(i+1\) 中间插入 \(n\),其中 \(P_i<P_{i+1}\),这里会增加一个小于号,同时会破坏原来的一个小于号,所以总的小于号数量是不变的。所以它由 \(\left<\begin{matrix}n-1\\k\end{matrix}\right>\) 转移来,情况数即原排列中小于号的数量为 \(k\) 种
  • 在某一个位置 \(i\) 和 \(i+1\) 中间插入 \(n\),其中 $P_i>P_{i+1}$​,那么这里会增加一个小于号,从 \(\left<\begin{matrix}n-1\\k-1\end{matrix}\right>\),情况数即大于号的数量即 \((n-2)-(k-1)\),其中 \(n-2\) 表示长度为 \(n-1\) 的排列共有 \(n-2\) 个间隙

所以综上所述,\(\left<\begin{matrix}n\\k\end{matrix}\right>=(k+1)\left<\begin{matrix}n-1\\k\end{matrix}\right>+(n-k)\left<\begin{matrix}n-1\\k-1\end{matrix}\right>\)

下接 part2

CF1349F 【Slime and Sequences】part1的更多相关文章

  1. CF1349F 【Slime and Sequences】part2

    由于本文过长,\(\LaTeX\) 炸了,分两篇,part1 优化 我们假装不会欧拉数的通项式(其实是因为它的通项式不容易继续优化?),使用容斥代替掉欧拉数 设 \(\begin{vmatrix}n\ ...

  2. 【K8S学习笔记】Part1:使用端口转发访问集群内的应用

    本文介绍如何使用kubectl port-forward命令连接K8S集群中运行的Redis服务.这种连接方式有助于数据库的调试工作. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同 ...

  3. Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】

    python 目录 (一).交换 (Exchanges) -- 1.1 武sir 经典 Exchanges 案例展示. (二).临时队列( Temporary queues ) (三).绑定(Bind ...

  4. 【字符串算法3】浅谈KMP算法

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KM ...

  5. 【leetcode 字符串处理】Compare Version Numbers

    [leetcode 字符串处理]Compare Version Numbers @author:wepon @blog:http://blog.csdn.net/u012162613 1.题目 Com ...

  6. 【九度OJ】题目1442:A sequence of numbers 解题报告

    [九度OJ]题目1442:A sequence of numbers 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1442 ...

  7. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  8. 【夯实PHP基础】PHP数组,字符串,对象等基础面面观

    本文地址 分享提纲 1.数组篇 2.字符创篇 3.函数篇 4.面向对象篇 5.其他篇 /*************************** 一.数组篇 Begin***************** ...

  9. 【Java学习系列】第3课--Java 高级教程

    本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...

随机推荐

  1. java 面向对象(四十三):反射(七)反射应用四:动态代理

    1.代理模式的原理:使用一个代理将对象包装起来, 然后用该代理对象取代原始对象.任何对原始对象的调用都要通过代理.代理对象决定是否以及何时将方法调用转到原始对象上. 2.静态代理2.1 举例:实现Ru ...

  2. 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?

    https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...

  3. Nginx日志按天切割基本配置说明

    1.声明日志格式 声明log    log位置                log格式; access_log logs/access.log main; 2.定义日志格式(以下为常用的日志格式 可 ...

  4. OSCP Learning Notes - Scanning(1)

    TCP vs UDP TCP: Connection-oriented Suited for applications that require high reliablity[HTTP, FTP,T ...

  5. Python3 生成器解析

    第6章 函数 6.1 函数的定义和调用 6.2 参数传递 6.3 函数返回值 6.4 变量作用域 6.5 匿名函数(lambda) 6.6 递归函数 6.7 迭代器 6.8 生成器 6.9 装饰器 6 ...

  6. vector基本用法

    Vector作为STL容器中的一员,使用频率非常高,因此对其基本用法和实用技巧进行记录,便于后期查询使用. 基本用法 #include <iostream> #include <ve ...

  7. java并发编程[持续更新]

    目录 java并发编程 1.常用类介绍 Semaphore 2.名词解释 2.1 线程安全 2.2 可重入锁和不可重入锁 java并发编程 1.常用类介绍 Semaphore Semaphore 类是 ...

  8. apache 添加多个站点

    虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术.可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口,也可让多个网站拥有不同的域 ...

  9. 关于页面布局中,如何让一个div水平和垂直居中的五个方案

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 面试题十八:在O(1)的时间内删除链表的节点

    方法一:将要删除的·节点的下一个节点的内容复制到该节点上,然后删除下一个节点注意特殊情况:链表只有一个节点时,则删除头节点,则把头节点设置为null, 如果删除的尾节点则需要顺序遍历链表,取得前序节点 ...