当前位置: 首页 > web >正文

NOIP 模拟赛 7

T1

有个字符串 SSS,你可以删除其的任意子串,询问会得到多少本质不同字符串。
要求线性,字符集小。

考虑容斥,转化成会数重复多少次,注意到每加入一个字符,它并不会影响到前面的点造成的贡献,于是我们只需要统计以 iii 开头的后缀匹配前缀会算重多少,注意到我们只需要统计前面出现过多少次 SiS_iSi 即可。因为我们只需要考虑 iii 什么时后不必须,显然就是有一个位置 ppp,满足 Sp=SiS_p=S_iSp=Si,那么删除 [p,i−1][p,i-1][p,i1][p+1,i][p+1,i][p+1,i] 效果等同。

T2

给定一个简单无向图(无自环重边),求 sssttt 的不连续经过同一条边,经过边数为 kkk 的方案数有多少。
多组询问,询问次数 q≤100q\le100q100,点数 n≤200n\le200n200,边数 m≤n(n−1)2m\le \frac{n(n-1)}{2}m2n(n1)k≤109k\le10^9k109,最开始给定固定的 sssttt

首先我们能发现,如果没有不连续经过同一条边的限制就是直接将到达关系转化成邻接矩阵 EEE,然后求 B×EkB\times E^kB×Ek,其中 BBB 为初始矩阵,也就是只有 sss 的位置为 111

于是容易想到去容斥,容斥的话要知道具体到了哪一个点,于是我们记 f(i,j)f(i,j)f(i,j) 表示走 iii 条边到 jjj 的方案数(满足题目条件)。

然后我们能发现对于 i>2i>2i>2f(i,u)←(∑v→uf(i−1,v))−(degreeu−1)×f(i−2,u)f(i,u)\gets(\sum_{v\to u} f(i-1,v))-(\text{degree}_u-1)\times f(i-2,u)f(i,u)(vuf(i1,v))(degreeu1)×f(i2,u)

也就是说我们减去在 i−2i-2i2 步后走两步走回到 uuu 的方案,但是 degreei\text{degree}_idegreei 要减去 111 的原因是 i>2i>2i>2 时,你 f(i−1,v)f(i-1,v)f(i1,v) 不会考虑 v→u→vv\to u\to vvuv 的方案。然而 f(i−2,u)f(i-2,u)f(i2,u) 会考虑 v→uv\to uvu 的方案,也就是说,你多减去了 v→u→v→uv\to u\to v\to uvuvu 的方案,要加上。

根据上文分析,容易发现 i=2i=2i=2 时不用减掉 111 即可,i=1i=1i=1 不需要容斥。

不难发现这是线性变换,于是你维护一个 (2n)×(2n)(2n)\times(2n)(2n)×(2n) 的矩阵来转移即可。

注意到要多测,你直接暴力是 O(q×n3log⁡k)O(q\times n^3\log k)O(q×n3logk) 的,无法通过,我赛后才了解到有这么一个技巧:我们预处理快速幂需要访问到的矩阵,也就是转移矩阵的 2x2^x2x,然后就转化成为向量乘矩阵,这个东西得到的也是向量,于是可以 O(n2)O(n^2)O(n2) 的乘,总复杂度 O(n3×log⁡k+q×n2log⁡k)O(n^3\times \log k+q\times n^2\log k)O(n3×logk+q×n2logk)

T3

2n2n2n 个人,你要将他们平分222 组,然后给出 mmm 个二元组 (ai,bi)(a_i,b_i)(ai,bi),表示若编号为 aia_iaibib_ibi 的人被分到同一组,会对划分的代价增加 2i2^i2i 的贡献。求最小划分代价。
n≤5000n\le5000n5000m≤106m\le10^6m106ai<bia_i<b_iai<bi(ai,bi)(a_i,b_i)(ai,bi) 互不相同。

考虑没有平分的限制怎么做,这个东西显然可以贪心,用个并查集维护一下连通性即可。

接着考虑需要平分,首先对于一组有关的人(也就是钦定他们划分到相同或者不同的人),他们可以表示成二元组 (pi,qi)(p_i,q_i)(pi,qi),表示有 pip_ipi 个人分在同一组,另外 qiq_iqi 分到另一组,平分的限制就相当于有若干二元组,你需要满足对于每个二元组都选出来一个数,然后让他们的和为 nnn

这个东西可以用背包检查。但是直接背包是 O(n2m)O(n^2m)O(n2m) 的,有一个显然的优化就是我们只会在 aia_iaibib_ibi 不在一个集合中才会做背包检查,然后如果我们已经检验过不可以就也不会再检查。我们将已经检查过不会合并的两个集合虚拟连边,就可以做到每次都会减少一个集合。于是我们会做 O(n)O(n)O(n) 次背包,于是复杂度变为 O(n3)O(n^3)O(n3),同样的,由于 dp 的是可行性,于是可以 bitset 优化,复杂度变为 O(n3ω)O(\frac{n^3}{\omega})O(ωn3)

注意到 dp 可行性会浪费异常多的空间和时间,考虑转化成记方案数,但是方案数会特别多,对一个大质数取模即可,我们最多可以取 2182^{18}218 级别的数。

考虑分析错误概率:f≤(1045000)≤2104≤104000f\le \binom{10^4}{5000}\le2^{10^4}\le10^{4000}f(5000104)2104104000,注意如果我们使得素数 p1,p2,…,pnp_1,p_2,\dots,p_np1,p2,,pn 失效,那么 p1p2p3…pn∣fp_1p_2p_3\dots p_n|fp1p2p3pnf,注意到 (107)600≥104000(10^7)^{600}\ge 10^{4000}(107)600104000,于是最多失效 600600600 个素数(事实上远远不到),然而 101810^{18}1018 有大约 1018ln⁡1018≥2×1016\frac{10^{18}}{\ln 10^{18}}\ge2\times10^{16}ln101810182×1016 个素数,失效概率为 60022×1016\frac{600}{2^{2\times10^{16}}}22×1016600,几乎可以忽略。

我们发现转化成

未完待续。

http://www.xdnf.cn/news/16405.html

相关文章:

  • ZYNQ芯片,SPI驱动开发自学全解析个人笔记【FPGA】【赛灵思
  • 同声传译新突破!字节跳动发布 Seed LiveInterpret 2.0
  • Win11批量部署神器winget
  • 滚珠导轨:手术机器人与影像设备的精密支撑
  • 升级目标API级别到35,以Android15为目标平台(三 View绑定篇)
  • 上位机程序开发基础介绍
  • Round-Robin仲裁器
  • 深入理解 BIO、NIO、AIO
  • RocketMQ学习系列之——客户端消息确认机制
  • jwt 在net9.0中做身份认证
  • [2025CVPR-图象分类方向]CATANet:用于轻量级图像超分辨率的高效内容感知标记聚合
  • C# WPF 实现读取文件夹中的PDF并显示其页数
  • 案例分享|告别传统PDA+便携打印机模式,快速实现高效率贴标
  • Class18卷积层的填充和步幅
  • uniapp之微信小程序标题对其右上角按钮胶囊
  • 测试ppyoloe的小样本few-shot能力,10张图片精度达到69.8%
  • Allegro软件光绘文件Artwork到底如何配置?
  • Python柱状图
  • Lakehouse x AI ,打造智能 BI 新体验
  • 戴尔电脑 Linux 安装与配置指南_导入mysql共享文件夹
  • 关于网络模型
  • FreeRTOS—优先级翻转问题
  • vue项目入门
  • 【C++避坑指南】vector迭代器失效的八大场景与解决方案
  • haproxy七层代理(原理)
  • 从0开始学习R语言--Day57--SCAD模型
  • 深入浅出设计模式——创建型模式之简单工厂模式
  • Hive【Hive架构及工作原理】
  • 如何高效通过3GPP官网查找资料
  • JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发