2024初秋集训——提高组 #24

news/2024/9/29 11:35:04

A. 平滑数列

题目描述

我们定义一个正整数数列是平滑的当且仅当任意两个相邻元素的差 \(\le 1\)

求长度为 \(N\) 的字典序第 \(K\) 小的平滑数列。

思路

首先我们做一个 \(dp\):求出长度为 \(i\) 的首项为 \(j\) 的平滑数列数量,这里 \(j\) 只用枚举到 \(i\) 就足够了,因为 \(j>i\) 的部分等于 \(dp_{i,i}\)

接着我们从前往后一位一位地确定。我们枚举这一位上是什么数字,如果当前是最后一个数字 \(x\) 使得第一位数字 \(\le x\) 的方案数之和 \(\ge k\),则当前这一位显然为 \(x\)。如果枚举到了 \(N\) 还不满足,就用除法求解。并令 \(K\leftarrow K-(<x的方案数)\)

时空复杂度均为 \(O(N^3)\)

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;const int MAXN = 45;int n;
ll k;
__int128 dp[MAXN][MAXN][2 * MAXN], sum[MAXN][MAXN];int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> k;for(int i = 1; i <= n; ++i) {dp[i][1][i] = sum[i][1] = 1;}for(int x = 1; x <= n; ++x) {for(int i = 2; i <= n; ++i) {for(int j = 1; j <= 2 * n - 1; ++j) {dp[x][i][j] = dp[x][i - 1][j];if(j > 1) {dp[x][i][j] += dp[x][i - 1][j - 1];}if(j < 2 * n - 1) {dp[x][i][j] += dp[x][i - 1][j + 1];}sum[x][i] += dp[x][i][j];}}}k--;ll last = 0;for(int i = 1; i <= n; ++i) {ll p = 0;if(i == 1) {for(int j = 1; j < n; ++j) {if(sum[j][n - i + 1] <= k) {k -= sum[j][n - i + 1];}else {p = j;break;}}}else {for(ll j = last - 1; j <= last + 1; ++j) {if(sum[min(0ll + n, j)][n - i + 1] <= k) {k -= sum[min(0ll + n, j)][n - i + 1];}else {p = j;break;}}}if(!p) {cout << n + (ll)(k / sum[n][n - i + 1]) << " ";last = n + (ll)(k / sum[n][n - i + 1]);k %= sum[n][n - i + 1];}else {cout << p << " ";last = p;}}return 0;
}

C. 连接传送门

题目描述

给定一个字符串 \(S\),你要构造一个排列 \(p\),使得如果 \(p_i>i\) 那么必须满足 \(S_{p_i}=1\)。求方案数。

思路

\(dp_{i,j}\) 表示考虑前 \(i\) 个,其中有 \(j\) 个数的 \(p_k>i\) 且未确定的方案数。

每次转移到 \(i+1\) 时,位置 \(i+1\) 可以选择 \(p_{i+1}\le i+1或>i+1\),并且若 \(S_{i+1}=1\),之前还未确定的可以连向 \(i+1\)

时空复杂度均为 \(O(N^2)\)

代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 5005, MOD = 998244353;int t, n, dp[MAXN][MAXN];
string s;void Solve() {cin >> s;n = s.size(), s = ' ' + s;for(int i = 0; i <= n; ++i) {for(int j = 0; j <= i; ++j) {dp[i][j] = 0;}}dp[0][0] = 1;for(int i = 0; i < n; ++i) {for(int j = 0; j <= i; ++j) {dp[i + 1][j + 1] = (dp[i + 1][j + 1] + dp[i][j]) % MOD;dp[i + 1][j] = (dp[i + 1][j] + 1ll * dp[i][j] * j % MOD) % MOD;if(s[i + 1] == '1') {dp[i + 1][j] = (dp[i + 1][j] + 1ll * dp[i][j] * j % MOD) % MOD;}if(s[i + 1] == '1' && j) {dp[i + 1][j - 1] = (dp[i + 1][j - 1] + 1ll * dp[i][j] * j % MOD * j % MOD) % MOD;}}}cout << dp[n][0] << "\n";
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);for(cin >> t; t--; Solve()) {}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

工作繁杂,如何防止工作遗漏遗忘?

来源:tita.com 不知道大家工作中是否有这样的情况:1.工作过程中工作任务经常被打断,打乱正常的工作节奏; 2.因为不方便统一记录工作及工作要求,经常忘记给领导反馈工作进展; 3.因为工作繁多,经常会出现工作遗漏遗忘的现象。 …… 如果你的工作计划出现了这样的问题,就是…

GaussDB数据库特性-物化视图简介

一、前言 随着企业数据量的不断增长和业务需求的复杂性增加,选择一个高效、可靠且智能的数据存储和管理解决方案变得越来越重要。GaussDB是一种先进的关系型数据库管理系统,为企业提供了强大的数据处理能力,其物化视图(Materialized Views)功能在数据查询和管理方面具有重…

微软账号注册

注册地址 https://signup.live.com/signup 少侠,我看你气度不凡天赋异禀,骨骼精奇,这么帅,来了就帮推荐一把吧 我的最近更新 最新发布文章、框架、咨询等,来看看吧

解决:PC微信弹窗《当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录》

目录1. 背景 2. 利用cheat Engine直接修改内存 3. 利用Python代码直接修改内存1. 背景虽然人类都是喜新厌旧的,但也不是什么东西都是新的好。今天换了台服务器,发现正常使用微信,弹窗提醒说版本太低了,根本不给登录。没办法啊,机器人只兼容这个版本的,只能到处找解决方案…

黑马PM-内容项目-需求收集管理

什么是需求需求如何收集 常见需求收集方式竞品分析用户访谈实地调研需求管理

浅浅记录学习情况叭

Basic Concepts对于一个给定的网络G=(V,E),其中V为网络的节点集,E为网络的边集. Trace(迹): 将G划分为q个社区,我们用一个qxq的对称矩阵e来表示该划分,e中的每个元素表示连接社区i与社区j的边在G的全部边中所占的比例显然有∑i,jeij=1。矩阵e的迹Tr(e)表示连接社区内部节点的边…

sentinel-transport-SPI-HeartbeatSenderInitFunc

说明 我们引入以下依赖<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.6</version> </dependency>配置环境变量-Dcsp.sentinel.dashboard.server=loca…

这些年出版的书籍——归档整理

随着出版的书籍越来越多,收到的各种邮件也越来越频繁,遂于百忙之中,抽空整理一下书籍相关的资料和信息。《ASP.NET MVC企业级实战》出版日期:2017年3月目录:https://www.cnblogs.com/jiekzou/p/5625762.html随书源码:因某些原因,原百度云盘下载地址已被封,qq群文件里面…