CF1603E A Perfect Problem 题解

news/2024/9/18 11:21:21/文章来源:https://www.cnblogs.com/Scarab/p/18412885

Description

称一个序列为好序列当且仅当这个序列的 \(\max\times \min\ge sum\),其中 \(sum\) 是序列元素和。

给定 \(n,M\),求长度为 \(n\),每个数在 \([1,n+1]\) 范围内,每个非空子序列(包含序列本身)都是好序列的整数序列个数,对 \(M\) 取模。

\(1\le n\le 200\)\(10^8\le M\le 10^9\),保证 \(M\) 为素数。

Solution

容易发现可以将序列排序后转化为判断所有前缀是否合法。这样就可以暴力 dp 了,时间复杂度:\(O(n^6)\)

考虑优化。下面有合法序列的几条性质:

  1. \(\forall k,a_k\geq k\),因为如果 \(a_k<k\),则 \(a_1a_k<k\cdot a_1\leq \sum_{i=1}^{k}{a_i}\),矛盾了。

  2. \(a_k=k\),则 \(a_1=a_2=\ldots=a_k=k\)。因为 \(a_1a_k=k\cdot a_1\geq\sum_{i=1}^{k}{a_i}\),所以 \(a_1=a_2=\ldots=a_k=k\)

  3. \(a_n=n+1\),则 \(\forall a_k\geq k+1\)\([1,k]\) 合法。因为 \(a_1a_n=(n+1)a_1\geq\sum_{i=1}^{n}{a_i}\),则 \(a_1\geq\sum_{i=1}^{n}{(a_i-a_1)}\geq\sum_{i=1}^{k}{(a_i-a_1)}\),所以 \(a_1a_k\geq (k+1)a_1\geq\sum_{i=1}^{k}{a_i}\)


对于 \(a_n=n\) 的情况很容易。

对于 \(a_n=n+1\),一个序列合法的条件即为:

  • \(\forall 1\leq i\leq a_1,a_1\leq a_i\leq n+1\)

  • \(\forall a_1+1\leq i\leq n,i+1\leq a_i\leq n+1\)

  • \(\sum_{i=1}^{n}{(a_i-a_1)}\geq a_1\)

\(b_i=a_i-a_1\),则:

  • \(\forall 1\leq i\leq a_1,0\leq b_i\leq n+1-a_1\)

  • \(\forall a_1+1\leq i\leq n,i+1-a_1\leq b_i\leq n+1-a_1\)

  • \(\sum_{i=1}^{n}{b_i}\geq a_1\)

这样就可以 dp 了。先枚举 \(a_1\) 的值,可以设 \(f_{i,j,k}\) 填了 \(b\) 的前 \(i\) 位,和为 \(j\),当前的最大值为 \(k\) 的方案数。

转移时可以枚举 \(0\sim k-1\) 的总个数 \(i\)\(b\) 的前 \(i\) 项的和 \(j\)\(k\) 的出现次数 \(cnt\),则当 \(i+cnt+1-a_1\leq k\leq n+1-a_1\) 时,即可让 \(f_{i+cnt,j+cnt\cdot k,k}\leftarrow \frac{f_{i,j,k-1}}{cnt!}\)

时间复杂度:\(O(n^4\log n)\),过不了。


注意到 \(a_1\) 的值不会很大,并且 \(a_1\geq n-2\sqrt n\)。证明就考虑 \(a_1\geq\sum b_i\geq\sum_{i=a_1+1}^{n}{(i-a_1+1)}=\frac{(n+a_1+3)(n-a_1)}{2}-a_1(n-a_1)\),可以得到 \(a_1\geq n-2\sqrt n\)

这样 \(a_1\) 的枚举数量就只有 \(O(\sqrt n)\) 级别了。

时间复杂度:\(O(n^3\sqrt n\log n)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 205;int n, mod;
int fac[kMaxN], ifac[kMaxN], f[kMaxN][kMaxN][kMaxN];constexpr int qpow(int bs, int64_t idx = mod - 2) {int ret = 1;for (; idx; idx >>= 1, bs = (int64_t)bs * bs % mod)if (idx & 1)ret = (int64_t)ret * bs % mod;return ret;
}inline int add(int x, int y) { return (x + y >= mod ? x + y - mod : x + y); }
inline int sub(int x, int y) { return (x >= y ? x - y : x - y + mod); }
inline void inc(int &x, int y) { (x += y) >= mod ? x -= mod : x; }
inline void dec(int &x, int y) { (x -= y) < 0 ? x += mod : x; }void prework() {fac[0] = ifac[0] = fac[1] = ifac[1] = 1;for (int i = 2; i <= n + 1; ++i) {fac[i] = 1ll * i * fac[i - 1] % mod;ifac[i] = qpow(fac[i]);}
}void dickdreamer() {std::cin >> n >> mod;prework();int ans = 1;for (int a1 = std::max<int>(n - 18, 1); a1 <= n; ++a1) {for (int i = 0; i <= n; ++i)for (int j = 0; j <= a1; ++j)for (int k = 0; k <= n - a1 + 1; ++k)f[i][j][k] = 0;for (int i = 1; i <= a1; ++i) {f[i][0][0] = 1ll * fac[n] * ifac[i] % mod;}for (int k = 1; k <= n - a1 + 1; ++k) {for (int i = 1; i <= n; ++i) {for (int j = 0; j <= a1; ++j) {for (int cnt = 0; cnt <= std::min(n - i, (a1 - j) / k); ++cnt) {if (k >= i + cnt - a1 + 1) {inc(f[i + cnt][j + cnt * k][k], 1ll * f[i][j][k - 1] * ifac[cnt] % mod);}}}}}for (int i = 0; i <= a1; ++i) inc(ans, f[n][i][n - a1 + 1]);}std::cout << ans << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;// std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

JOI Open 2016

T1 JOIRIS你在玩俄罗斯方块,游戏区域是一个宽度为 \(n\),高度足够大的矩形网格、初始时第 \(i\) 列有 \(a_i\) 个方块。 给定参数 \(k\),你可以做不超过 \(10^4\) 次操作,来将这个网格中的所有方块全部消除,一次操作形如:在网格的最顶端落下一个 \(1 \times k\) 或者 \(k…

章12——异常exception

异常 快捷键 ctrl + alt + t 选中 try-catch 如果进行异常处理,即使出现了异常,程序可以继续执行。异常介绍 开发过程中的语法错误和逻辑错误不是异常。 执行过程中所发生的异常事件可分为如下两大类:异常体系图小结:常见的运行时异常没有关联的类不能进行上下转型 异常处理…

APB总线总结

APB总结 一、简介 APB提供了一个低功耗的接口,并降低了接口的复杂性。APB接口用在低带宽和不需要高性能总线的外围设备上。APB是非流水线结构,所有的信号仅与时钟上升沿相关,这样就可以简化APB外围设备的设计流程,每个传输至少耗用两个周期。 二、信号列表信号名 来源 描述…

面试- Web安全

XSS攻击(跨站脚本攻击)XSS预防 < < > >XSRF(CSRF)攻击(跨站请求伪造)就像是你在不知情的情况下,被别人利用你的权限发起了某个你没打算进行的请求。重点是可以把你的用户信息给带过去,你不知不觉就帮我付款了。XSS 是恶意代码“潜伏”在页面上,欺骗你去执行…

k8s 中的 Service 简介【k8s 系列之二】

〇、前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址,那么是不是有 IP 了,访问起来就简单了呢,其实不然。 因为在 k8s 中 Pod 不是持久性的,摧毁重建将获得新的 IP,客户端通过会变更 IP 来访问显然不合理。另外 Pod 还经常会通过多个副本来实现负载均衡,客户端如何高效的…

软工作业二:论文查重系统

这个作业属于哪个课程 <计科22级34班>这个作业要求在哪里 [<作业要求>](个人项目 - 作业 - 计科22级34班 - 班级博客 - 博客园 (cnblogs.com))这个作业的目标 通过实际编程任务,全面提升学生在编程、算法、项目管理、性能优化、代码测试和版本控制等方面的能力,为…

面试-JS基础知识-作用域和闭包

问题this的不同应用场景 手写bind函数 实际开发中闭包的应用场景,举例说明 创建10个<a>标签,点击的时候弹出来对应的序号作用域:某个变量的合法使用范围全局 函数 块级** 自由变量上面图的最里面的红框————a a1 a2都是自由变量,因为都没有被定义。会一层一层往上…

学习高校课程-软件设计模式-软件设计原则(lec2)

软件设计原则Feature of Good Design (1) 优秀设计的特点(一) Code reuse 代码复用 – Challenge: tight coupling between components, dependencies on concrete classes instead of interfaces, hardcoded operations – Solution: design patterns – 挑战:组件之间的紧…

ATTCK红队评估(红日靶场4)

靶场介绍本次靶场渗透反序列化漏洞、命令执行漏洞、Tomcat漏洞、MS系列漏洞、端口转发漏洞、以及域渗透等多种组合漏洞,希望大家多多利用。 环境搭建 机器密码 WEB主机 ubuntu:ubuntuWIN7主机 douser:Dotest123(DC)WIN2008主机 administrator:Test2008网络配置111网段是web的网…

Markdown随笔

冰冻三尺非一日之寒,持之以恒方位始终。 Markdown语法讲解标题一共六级标题分别为Ctrl+1~6: 一级 二级 三级 四级 五级 六级字体 粗体 粗斜体 斜体 删除线引用一个大于号>分割线图片超链接 点击进入百度百科列表 数字加上空格(有序) 点加上空格(无序)表格姓名 性别 年…

tarjan里的定义

强连通分量 - OI Wiki (oi-wiki.org)从以u为根的子树中的任意点出发。单次到达(从这个点指向某个点,有一条边) 的这些点中的dfn的最小值以v为根的子树,包含在以u为根的子树中,low[v]所用的子节点,一定也可以被low[u],这个点一定在以u为根的子树里,所以用low[v] 从u这个…

南沙csp-j/s一对一家教陈老师解题:1317:【例5.2】组合的输出

​【题目描述】排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 现要求你用递归的方法输出所有组合。 例如n=5,r=3,所有组合为: 1 2 3 1 2 4 1 2 5 1 3 4 1 …