P7213 [JOISC2020] 最古の遺跡 3

news/2025/1/10 19:27:07/文章来源:https://www.cnblogs.com/Aria-Math/p/18664569

考虑另一种刻画过程的方式:设 \(a_i\) 为原序列,\(b_i\) 为最终序列,则有:

  • 从后往前扫描,\(b_i\) 会持续降低到 \([i+1, n]\) 中未出现 \(b_i\)

考虑 dp,设 \(f(i, j)\) 表示考虑了 \([i, n]\),当前在 \(b\)\(1 \sim j\) 都出现过的方案数。这里要区分相等的两个数,且只填了 \([1, j]\) 中的数,\([j+1,n]\) 中的数还没分配位置。

\(b_i\) 最终降到 \(0\)

  • \(i\) 处可以填 \([1, j]\),假设 \([i+1,n]\) 中一共有 \(c_0\)\(0\),则系数为 \(j - c_0\)

\(b_i\) 最终不为 \(0\)

  • \(b_i> j + 1\),则现在先不分配 \(a_i\),系数为 \(1\)
  • \(b_i = j + 1\),枚举此时 \(1 \sim j + k\) 都出现过,则有:
    1. 要在 \([j+1,n]\) 中的非 \(0\) 位置里选出 \(k-1\) 个位置,系数为 \(\dbinom{n-i-c_0}{k-1}\)
    2. \(a_i\) 可以填 \([j+1, j + k]\),且 \(j+1\) 有两种选择,系数为 \(k+1\)
    3. 后面 \(k - 1\) 个位置可以填 \([j+2,j+k]\),且最终要形成 \(j+2 \sim j+k\) 的排列,假设系数为 \(g(k-1)\)

设有 \(g(n)\) 表示 \(n\) 个位置,\(a_i \in [1, n]\),且 \(b_i\) 构成 \(1 \sim n\) 的排列的方案数。

转移考虑枚举 \(b_n = i\),则转化为 \([1, i - 1]\)\([i+1, n]\) 的子问题,有

\[g(n) = \sum_{i=1}^{n} \binom{n - 1}{i - 1}(n - i + 1)g(i - 1)g(n- i) \]

总时间复杂度 \(\mathrm{O}(n ^ 3)\)

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
using ll = long long;
const int N = 610;
const int M = 1210;
const int MOD = 1e9 + 7;
int n, m, occur[M];
ll fac[M], ifac[M], f[M][N], g[N];
ll Pow(ll a, int p = MOD - 2) {ll ans = 1;for(; p; p >>= 1, a = a * a % MOD)if(p & 1) ans = ans * a % MOD;return ans;
}
ll C(int n, int m) {if(n < 0 || m < 0 || n < m) return 0;return fac[n] * ifac[m] % MOD * ifac[n - m] % MOD;
}
int main() {//freopen("data.in", "r", stdin);//freopen("code.out", "w", stdout);cin.tie(0)->sync_with_stdio(0);cin >> n, m = n * 2;for(int i = 1, x; i <= n; ++i)cin >> x, occur[x] = 1;fac[0] = 1;for(int i = 1; i <= m; ++i)fac[i] = fac[i - 1] * i % MOD;ifac[m] = Pow(fac[m]);for(int i = m - 1; i >= 0; --i)ifac[i] = ifac[i + 1] * (i + 1) % MOD;g[0] = 1;for(int x = 1; x <= n; ++x)for(int i = 1; i <= x; ++i)g[x] = (g[x] + C(x - 1, i - 1) * (x - i + 2) % MOD * g[i - 1] % MOD * g[x - i]) % MOD;f[m + 1][0] = 1;int c0 = 0, c1 = 0;for(int i = m; i >= 1; --i) {for(int j = 0; j <= n; ++j) if(f[i + 1][j]) {if(occur[i]) {f[i][j] = (f[i][j] + f[i + 1][j]) % MOD;	for(int k = 1; k <= n - j; ++k)f[i][j + k] = (f[i][j + k] + C(c1 - j, k - 1) * (k + 1) % MOD * f[i + 1][j] % MOD * g[k - 1]) % MOD;				}else {f[i][j] = (f[i][j] + f[i + 1][j] * (j - c0)) % MOD;	}}c0 += occur[i] == 0, c1 += occur[i] == 1;}printf("%lld\n", f[1][n] * Pow(Pow(2, n)) % MOD);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867286.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

潮汐指纹识别工具 : 在线网站识别利器

最近发现了一个免费在线收集网站信息的工具,感觉挺好用的,给各位推荐下。潮汐在线指纹识别是山东新潮信息技术有限公司安全团队提供的一个免费开源在线网站信息收集工具。 功能亮点: 全面扫描 只需输入目标网站的URL或IP地址,即可获取该网站的标题、中间件、操作系统、域名…

JAVA-Day 11:数组的静态初始化和遍历

数组的静态初始化和遍历 数组静态初始化格式 数组的静态初始化与遍历 完整格式:数据类型 [] 数组名=new 数据类型[]{元素1,元素2,元素3,....} 简化格式:数据类型 [] 数组名={元素1,元素2,元素3,....} []在数组名前后都可以 代码如下: int number[]={1,2,3,4,5};for (int …

JAVA-Day 10:Do...While循环语句

Do...While循环语句 Do...While循环格式 初始化语句; do{ 循环体语句; 条件控制语句; }while(条件判断语句); 例: 使用do...while循环输出1-10的和(包括10) int i=1;int count=0;do{count+=i;i++;}while(i<=10);System.out.println(count);代码运行结果如下图所示:

配置tigerVNC,登陆远程服务器

1.在远程服务器安装、配置 (1) sudo apt update sudo apt install xfce4 xfce4-goodies (2) 安装TigerVNC sudo apt install tigervnc-standalone-server (3) 配置vnc vncpasswd (4) 配置.vnc: vim ~/.vnc/xstartup 添加:cat .vnc/xstartup#!/bin/sh # 启动 D-Bus 会话 (如果未…

CF1993F2 Dyn-scripted Robot (Hard Version)

Dyn-scripted Robot (Hard Version) 题目链接。 Problem Easy Version:\(K \le n\)。 Hard Version:\(K \le 10^{12}\)。 一个 \(Oxy\) 平面上有一个 \(w \times h\) 矩形,矩形的左下方有点 \((0, 0)\) ,右上方有点 \((w, h)\) 。 您还有一个最初位于点 \((0, 0)\) 的机器人…

OmniNxt 论文阅读

来源: https://arxiv.org/html/2403.20085?_immersive_translate_auto_translate=1 标题: OmniNxt: A Fully Open-source and Compact Aerial Robot with Omnidirectional Visual Perception OmniNxt 感觉是, 取自 Omnidirectional 中 全的意思, Nxt 像是 Next 的意思,表…

2024-12-1-#{}与¥{}的区别-response

{}与¥{}的区别response实现重定向response响应字符数据response响应字节数据以及导入工具类实现响应

手动部署前后端分离的项目到本地

1.准备工作 使用maven打包springboot项目为.jar文件得到springboot-0.0.1-SNAPSHOT.jar打包vue项目 npm install -g @vue/cli安装Vue CLI 在项目根目录下,运行npm run build命令来构建项目得到一个dist文件夹将打包好的文件通过远程仓库中转至docker虚拟机在虚拟机拉取镜像,并…

nvm 安装进行node多版本管理及环境变量配置

注意: 1、安装nvm之前需要卸载之前的nodejs,并且还要删除之前的环境变量配置,否则会出现一些奇怪的问题 2、nvm的安装路径不能有中文或者空格,否则后面在cmd中切换node版本会出现乱码 一、完全卸载旧的nodejs 参考文章《Node卸载超详细步骤》 1、打开系统的控制面板,点击卸…

M5Stack 发布全双工通信语音识别硬件;雷蛇发布 AI 游戏伴侣 Project AVA,实时指导复盘

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

WPF 怎么利用behavior优雅的给一个Datagrid添加一个全选的功能

前言:我在迁移旧项目代码的时候发现别人写很多界面都涉及到一个DataGrid的全选,但是每个都写的很混乱,现在刚好空闲下来,写一个博客, 给部分可能不太会写这个的同学讲一下,怎么实现全选功能,并且可以在任何项目里面复用这个功能。 先准备一个Datagrid,我们给这个DataGr…

使用chai3d-GEL模块进行软体模型力反馈仿真的一点碎片化记录

在要模拟的网格模型中手动添加节点或者对于形状比较复杂的模型使用TetGen之类的网格划分程序自动添加节点和连接;然后设置合理的仿真参数(质量、刚度、重力、时间步长...) 骨架驱动:SkeletonModel 使用骨架结构来表示变形体。骨架由一系列节点(cGELSkeletonNode)和连接这…