[CF2018F3] Speedbreaker Counting 做题记录

news/2025/2/1 10:52:33/文章来源:https://www.cnblogs.com/Sktn0089/p/18696197

考虑一个答案的超集 \(S = \cup_{i = 1} ^ n [i - a_i + 1, i + a_i - 1]\)

寻找更多的必要条件,对于 \(1\le x < y\le n\),若 \(\max(a_x, a_y) \le y - x\) 则起点 \(x\sim y\) 无效。

\(x + a_x - 1 < y\)\(x < y - a_y + 1\),说明起点 \(1\sim x - 1\)\(y + 1\sim n\) 都无效。

发现两者加起来是充要条件,所以起点集合要么是 \(S\),要么为空。

条件过于复杂,考虑如何转化为简单判定。对于当前区间 \([l, r]\),若左边存在 \(x\) 满足 \(a_x = r - x + 1\) 或右边存在 \(x\) 满足 \(a_x = x - l + 1\) 则必须向对应方向拓展,否则默认向左拓展。

发现这样是对的:若存在一对上述 \((x, y)\),那么无法同时向 \(x, y\) 拓展。而如果必须同时拓展,则一定存在这样一对 \((x, y)\)

考虑区间 dp,设 \(f_{l, r, 0/1}\) 表示区间 \([l, r]\) 拓展至 \([1, n]\),其中 \(a_{1\dots l - 1}\)\(a_{r + 1\dots n}\) 的取值方案数,且是否限定必须拓展右边。

但是 \(S\subset [l, r]\),可以使用二维差分解决。

  • 启示:寻找充要条件,多观察问题模型,观察条件形式。
点击查看代码
#include <bits/stdc++.h>
namespace Initial {#define ll long long#define ull unsigned long long#define fi first#define se second#define mkp make_pair#define pir pair <ll, ll>./#define pb push_back#define i128 __int128using namespace std; ll mod;const ll maxn = 3010, inf = 1e18, iv = mod - mod / 2;ll power(ll a, ll b = mod - 2, ll p = mod) {ll s = 1;while(b) {if(b & 1) s = 1ll * s * a %p;a = 1ll * a * a %p, b >>= 1;} return s;}template <class T>const inline ll pls(const T x, const T y) { return x + y >= mod? x + y - mod : x + y; }template <class T>const inline void add(T &x, const T y) { x = x + y >= mod? x + y - mod : x + y; }template <class T>const inline void chkmax(T &x, const T y) { x = x < y? y : x; }template <class T>const inline void chkmin(T &x, const T y) { x = x > y? y : x; }
} using namespace Initial;namespace Read {char buf[1 << 22], *p1, *p2;// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF : *p1++)template <class T>const inline void rd(T &x) {char ch; bool neg = 0;while(!isdigit(ch = getchar()))if(ch == '-') neg = 1;x = ch - '0';while(isdigit(ch = getchar()))x = (x << 1) + (x << 3) + ch - '0';if(neg) x = -x;}
} using Read::rd;ll t, n, f[maxn][maxn][2], res[maxn][maxn], p[maxn], ans[maxn];void solve() {rd(n), rd(mod); p[0] = 1;for(ll i = 1; i <= n; i++) {p[i] = 1, ans[i] = 0;for(ll j = 1; j <= i; j++)p[i] = p[i] * (n - max(j - 1, i - j)) %mod;}for(ll i = 0; i <= n + 1; i++)for(ll j = 0; j <= n + 1; j++)f[i][j][0] = f[i][j][1] = res[i][j] = 0;f[1][n][0] = 1;for(ll l = 1; l <= n; l++)for(ll r = l > 1? n : n - 1; r >= l; r--) {f[l][r][0] = (f[l - 1][r][0] + f[l - 1][r][1]) * (n - (r - l + 1)) %mod;f[l][r][1] = (f[l][r + 1][0] + f[l][r + 1][1] * (n - (r - l + 1))) %mod;}for(ll l = 1; l <= n; l++)for(ll r = n; r >= l; r--)res[l][r] = (f[l][r][0] + f[l][r][1]) * p[r - l + 1] %mod;for(ll l = n; l; l--)for(ll r = l; r <= n; r++) {res[l][r] = (res[l][r] + mod * 2 - res[l - 1][r]- res[l][r + 1] + res[l - 1][r + 1]) %mod;add(ans[r - l + 1], res[l][r]);}ans[0] = power(n, n);for(ll i = 1; i <= n; i++) add(ans[0], mod - ans[i]);for(ll i = 0; i <= n; i++) printf("%lld ", ans[i]); puts("");
}int main() {rd(t); while(t--) solve();return 0;
}

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

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

相关文章

第五节上,图像分类实战,食物分类

随机种子固定随机结果,方便复现 def seed_everything(seed):torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.benchmark = Falsetorch.backends.cudnn.deterministic = Truerandom.seed(seed)np.random.seed(seed)o…

对比使用DeepSeek与文新一言,了解DeepSeek的关键技术论文

DeepSeek是国内大模型技术的新秀,最近也在业界和媒体界火爆出圈,所以想学习一下其技术。 大模型时代,学习知识,当然首先想到利用大模型,由于在过去一年,对DeepSeek使用不多,所以想和文新一言(4.0 Turbo)对比使用。 通过对比,针对同一个问题“DeepSeek发扬开源文化,将…

Cisco NX-OS Software Release 10.5(2)F - 网络操作系统软件

Cisco NX-OS Software Release 10.5(2)F - 网络操作系统软件Cisco NX-OS Software Release 10.5(2)F - 网络操作系统软件 NX-OS 网络操作系统 请访问原文链接:https://sysin.org/blog/cisco-nx-os-10/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgCisco NX-OS…

pdf处理--tts(待重写)

1.提取正文2.裁剪页眉 https://smallpdf.com/cn/crop-pdf#r=crop-pages3.拆分4.ocr 效果图--白描:效果图--4Videosoft PDF Converter Ultimate:5.阅读器与tts引擎 开源阅读:https://github.com/gedoor/legado tts-server-android:https://github.com/jing332/tts-server-an…

INFINI Labs 产品更新 | Console 发布 TopN 功能,Easysearch 新增 Rollup 能力等

INFINI Labs 产品全新发布!此次更新为大家带来了 Console 的全新 TopN 功能,让您能够更高效地定位最关键的节点或索引;Easysearch 新增 Rollup 能力,大幅提升监控指标的存储周期并优化分析体验;此外,Framework 还修复了多项缺陷并进行了多处优化。欢迎下载体验,探索更多…

03-一个例子

登录被测系统bysms双击运行runserver.bat 访问页面:http://127.0.0.1/mgr/sign.html 账号:byhy,密码:88888888 可以直接在pycharm的Terminal中运行hytest,不需要打开命令行窗口 浏览器驱动的打印信息: 禁止 chromedriver 日志写屏1 from selenium import webdriver 2 3 …

blog tips

markdown 内嵌 html 使图片并排点击查看代码 <div style="display: flex; gap: 10px; justify-content: space-between;"><img src="图片1地址" style="width: 49%; height: auto;"/><img src="图片2地址" style="…

【数学】已知正方形相邻两点坐标求另外两点坐标

已知正方形相邻两点(a,b)与(c,d)坐标公式: \( (x_3,y_3) = (c + (b-d), d - (a-c)) \\ (x_4,y_4) = (a + (b-d), b - (a-c)) \\ (x_5,y_5) = (a - (b-d), b + (a-c)) \\ (x_6,y_6) = (c - (b-d), d + (a-c)) \)

25.1.31小记

多态类型声明类型 : 定义时候的类型 动态类型 : 运行到那里的时候对应的具体类型 向上造型(cast) : 将子类类型的对象赋给父类的变量 (不能将一个父类的变量赋予一个子类的变量) 赋值运算符 : 将管理者管理的对象进行改变(改变的是指针)其中造型(cast)的意义是将某…

MacOS修改应用快捷键的一般思路

具体步骤为:使用CheatSheet软件查看菜单项名称 在系统设置中修改菜单项的快捷键举个例子:修改Chrome中左右切换tab的快捷键(系统语言为英文,中文同理) 默认采用Ccontrol Tab和Control + Shift + Tab(或Command Shift [和Command Shift ])可以左右切换tab。 现在希望将其…

UE4.27, 模块实践, Slate的UI开发 (一)

1. 基本概念1.1. Slate是虚幻UI框架设计的底层,该框架中最基本的类是SWidget1.1.1.显然,我们容易注意到,直属于该框架的类拥有着指定的命名规则,即以S开头1.2. UMG, UWidget, Slate关联1.2.1. UMG:Unreal Motion Graphics UI Designer 虚幻的图形界面设计工具1.2.2. 单纯Sl…

Brainfly: 用 C# 类型系统构建 Brainfuck 编译器

Brainfly: 用 C# 类型系统构建 Brainfuck 编译器Brainfuck 简介 Brainfuck 是由 Urban Mller 在 1993 年创造的一门非常精简的图灵完备的编程语言。 正所谓大道至简,这门编程语言简单到语法只有 8 个字符,每一个字符对应一个指令,用 C 语言来描述的话就是:字符 含义> ++…