LOJ tangjz的背包
题目大意
有 \(n\) 个物品, 第 \(i\) 个物品的体积为 \(i\)
令 \(f(x)\) 为 选择 \(m\) 个物品, 体积和为 \(x\) 的方案数
令 \(V = \sum_{i=1}^m (n-i+1)\)
求 \(f(1)\cdots f(V)\) 关于 \(w=19190506\) 的 \(hash\) 值
\(1\le m\le n \le 10^{12}\)
subtask 1
考虑递推
\(f[n,m,x]\) 是 \((a_1,\cdots,a_m), a_i\ge 1, \sum a_i = x\) 的划分数量
我们让 \(a_i -= 1\) , 相当于物品大小变为 \([0,n-1]\), 所需体积变成 \(x-m\)
枚举 \(0\) 号物品是否选择
就得到递推式 \(f[n,m,x] = f[n-1,m,x-m] + f[n-1,m-1,x-m]\)
举个例子 (前两行平移了一下) :
f[3,1] = (0,1,1,1,0,0)
f[3,2] = (0,0,0,1,1,1)
f[4,2] = (0,0,0,1,1,2,1,1)
将第三维 \(hash\) 起来
那么 \(f[n-1,m-1]\) 那边需要补上后面的 \(n-m\) 个空位
而 \(f[n-1,m]\) 那边不需要
于是有 \(f[n,m] = f[n-1,m] + f[n-1][m-1] w^{n-m}\)
subtask 2
搞搞生成函数什么的.
subtask 3
观察本题的递推式, 有 \(\downarrow\), \(\searrow\) 两种移动方式
每列只能用恰好一次 \(\searrow.~~\) 确定好在哪里使用 \(\searrow\) 就可以确定路径
给 \(\searrow\) 标号. 设标号为 \(i\) 的 \(\searrow\) 在第 \(p_i\) 行使用
我们要算的东西是: $$\sum_{1\le p_1\lt p_2\lt \cdots\lt p_m\le n} \frac{\prod_{i=1}^m w{p_i}}{\prod_{i=1}m w^i}$$
考虑如下的变换 :
令 \(p'_i = p_i - \sum_{j<i} [p_j<p_i]\). 可知 \(1\le p'_i \le n-i+1\).
而对于任一一组满足条件的 \(p'\), 每次让 \(p_i\) 选在剩余可选位置中第 \(p'\) 个即可. 构成双射.
记 \(\sigma(p)\) 表示 \(p\) 中的顺序对个数
那么 \(\prod w^{p'_i} = w^{-\sigma(p)} \prod w^{p_i}\)
令 \(S\) 为 \(\sum_{排列(置换)} w^{\sigma}\)
我们对原式做一下变换
& \sum_{1\le p_1\lt p_2\lt \cdots\lt p_m\le n\\1\le q_1\lt q_2\lt \cdots \lt q_m \le m}\frac{ \prod w^{p_i} } { \prod w^{q_i} } && 等价形式\\
&= \sum_{p, q} \frac{ w^{\sigma(p)} \prod w^{p_i} } { w^{\sigma(q)} \prod w^{q_i} } && 上下同时乘S, 并将置换作用在p,q上\\
&= \sum_{p', q'} \frac{ \prod w^{p'_i} } { \prod w^{q'_i} }\\
&= \frac{ \prod_{i=1}^m (\sum_{j=1}^{n-i+1} w^j) } { \prod_{i=1}^m (\sum_{j=1}^{m-i+1} w^j)} && 交换计算顺序\\
&= \frac{ \prod_{i=1}^m (\sum_{j=0}^{n-i} w^j) } { \prod_{i=1}^m (\sum_{j=0}^{m-i} w^j)} && 上下同时除w^m \\
&= \frac{ [n]^{\underline m} } { [m]! } && [k] = \frac{q^k-1}{q-1}(等比数列和)\\
&= \frac{ \prod_{i=1}^m (q^{n-i+1}-1) } { \prod_{i=1}^m (q^i-1) }\\
\end{aligned}
\]
其实 \(f[n,m] = {\binom n m}_w\)
关于本题递推式的更多信息可以参考wiki
subtask 4
先回顾 lucas 定理 : \(\binom n m \equiv \binom {\lfloor \frac n p\rfloor}{\lfloor \frac m p\rfloor} \binom {n\bmod p}{m\bmod p} \pmod p\)
证明 :
\(n!\bmod p = (\prod_{i=1}^{\lfloor \frac n p\rfloor} ip)~(\prod_{i=1}^{p-1})^{\lfloor \frac n p \rfloor}~(\prod_{i=1}^{n\bmod p} i)\)
也即分成三个部分, 整除部分, 整块部分, 剩余部分
只有第一部分有 \(p\). 它可以写成 \(p^{\lfloor \frac n p \rfloor} \lfloor \frac n p \rfloor !\)
(1) \(\lfloor \frac {n-m} p \rfloor + \lfloor \frac m p \rfloor < \lfloor \frac n p \rfloor\)
此时幂部分 \(p\) 有剩余, 阶乘部分剩余为整数, 无法将 \(p\) 抵消. 值为 \(0\)
对应的, 在lucas定理中, \(n\bmod p + m\bmod p > p\), 使得组合数值为 \(0\)
(2) \(\lfloor \frac {n-m} p \rfloor + \lfloor \frac m p \rfloor = \lfloor \frac n p \rfloor\)
此时原式中的第一部分剩下的是组合数, 第二部分抵消, 第三部分不变.
这样不用生成函数来证明, 更容易推广一些
推广到这一题:
考虑令 \(w^a-1\equiv 0\) 的最小的 \(a\)
记 \(fac[n] = \prod_{i=1}^n (q^i-1)\)
那么 \(fac[n] = (\prod_{i=1}^{\lfloor \frac n a \rfloor}q^{ai}-1)~(\prod_{i=1}^{n-1} q^i-1)^{\lfloor \frac n a \rfloor}~(\prod_{i=1}^{n\bmod a} q^i-1)\)
因式分解 \(q^{ai}-1 = (q^a-1)(\sum_{k=0}^{i-1}q^{ak}) = i(q^a-1)\)
因此 $fac[n] = (qa-1){\lfloor \frac n p \rfloor} \lfloor \frac n p \rfloor! \(
剩下的推导就同理了, 最终得到:
\){\binom n m}_w = \binom {\lfloor \frac n a \rfloor}{\lfloor \frac m a \rfloor} {\binom {n\bmod a}{m\bmod a}}_w$
LOJ tangjz的背包的更多相关文章
- LOJ #6089. 小 Y 的背包计数问题
LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...
- loj 6089 小 Y 的背包计数问题——分类进行的背包
题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品 ...
- 2019.01.13 loj#6515. 贪玩蓝月(线段树分治+01背包)
传送门 题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(wi,vi)(w_i,v_i)(wi,vi),支持询问从当前队列中选取若干个元素是的他们的和对 MODMODM ...
- LOJ#2552. 「CTSC2018」假面(期望 背包)
题意 题目链接 Sol 多年以后,我终于把这题的暴力打出来了qwq 好感动啊.. 刚开始的时候想的是: 设\(f[i][j]\)表示第\(i\)轮, 第\(j\)个人血量的期望值 转移的时候若要淦这个 ...
- LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...
- loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化
LINK:珠宝 去年在某个oj上写过这道题 当时懵懂无知wa的不省人事 终于发现这个东西原来是有决策单调性的. 可以发现是一个01背包 但是过不了 冷静分析 01背包的复杂度有下界 如果过不了说明必然 ...
- LOJ#6089 小 Y 的背包计数问题 - DP精题
题面 题解 (本篇文章深度剖析,若想尽快做出题的看官可以参考知名博主某C202044zxy的这篇题解:https://blog.csdn.net/C202044zxy/article/details/ ...
- 【LOJ】#2523. 「HAOI2018」奇怪的背包
题解 复杂度怎么算也要2s的题怎么0.5s就跑完了,迷啊 这个题简直算完复杂度不敢写,写了就赚飞了好吧 根据裴蜀定理,显然选出的数和P的gcd是w的约数 我们考虑枚举\(P\)的约数,上限当然是\(\ ...
- 【题解】【LibreOJ Round #6】花团 LOJ 534 时间线段树分治 背包
Prelude 题目链接:萌萌哒传送门(/≧▽≦)/ Solution 如果完全离线的话,可以直接用时间线段树分治来做,复杂度\(O(qv \log q)\). 现在在线了怎么办呢? 这其实是个假在线 ...
随机推荐
- shell -- for、while用法
#数字段形式for i in {1..10}do echo $idone #详细列出(字符且项数不多)for File in 1 2 3 4 5do echo $Filedone #对存在的 ...
- mysql ON DUPLICATE KEY UPDATE、REPLACE INTO
INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?前提条件是这个表必须有一个唯一索引或主键 ...
- web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址
web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址 Huang Jie Blog .Com-前端开发 http://www.huangjieblog.com/?feed=rs ...
- Python 3基础教程32-正则
本文介绍Python的正则,通过本文介绍和一个练习,对正则有一个基本了解就可以. # 正则表达式 ''' 正则表达式是有一些特殊字符组成,能够帮你找到一些符合一定规则的字符串 先来了解几个符号所代表的 ...
- react实现换肤功能
一.目标 提供几种主题色给用户选择,然后根据用户的选择改变应用的主题色: 二.实现原理 1.准备不同主题色的样式文件: 2.将用户的选择记录在本地缓存中: 3.每次进入应用时,读取缓存 ...
- 11-Mysql数据库----单表查询
本节重点: 单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field ...
- Nginx 配置 HTTPS自签名证书
工具: OpenSSL ssl的开源实现,几乎实现了市面上所有的加密 libcrypto: 通用加密库, 任何软件要实现加密功能 链接调用这个库 libssl: TLS/SSL 加密库 openssl ...
- BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...
- DFS——CodeForces740DAlyona and a tree
一.题目回顾 题目链接:Alyona and a tree Examples Input 52 5 1 4 61 71 13 53 6 Output 1 0 1 0 0 Input 59 7 8 ...
- [译]在Python中如何使用额enumerate 和 zip 来迭代两个列表和它们的index?
enumerate - 迭代一个列表的index和item <Python Cookbook>(Recipe 4.4)描述了如何使用enumerate迭代item和index. 例子如下: ...