洛谷 子集积 题解

news/2024/11/19 23:33:40/

题目

P1 背包

子集积 > m >m >m 个数并不好求,考虑子集积 ≤ m \le m m 的个数 x x x,答案即为 ( 2 n − x ) (2^n - x) (2nx)

对于子集积 ≤ m \le m m 的个数,可以化为 0-1 背包问题做, f i , j f_{i,j} fi,j 表示前 i i i 个数,子集积为 j j j 的个数,有:

f i , j = ∑ j = 1 m f i − 1 , j a i f_{i,j}=\sum \limits_{j=1}^{m} f_{i-1,\frac {j} {a_i}} fi,j=j=1mfi1,aij j j j a i a_i ai 的倍数)。

背包问题常规地去掉一维: f j f_j fj 表示子集积为 j j j 的个数:

f j = ∑ j = 1 m f j a i f_j=\sum \limits_{j=1}^{m} f_{\frac {j} {a_i}} fj=j=1mfaij j j j a i a_i ai 的倍数)。

	cin >> n >> m;for(int i=1; i<=n; i++) cin >> a[i];f[1] = 1;for(int i=1; i<=n; i++)for(int j=(m / a[i]) * a[i]; j>=a[i]; j-=a[i])f[j] += f[j / a[i]], f[j] %= mod;int sum = qpow(2, n);for(int i=1; i<=m; i++)sum -= f[i],  sum = ((sum % mod) + mod) % mod;cout << sum;

时间复杂度 O ( n × ∑ i = 1 n m a i ) O(n \times \sum\limits_{i=1}^{n} {\frac {m} {a_i}}) O(n×i=1naim) ,最坏情况下 O ( n m ) O(nm) O(nm)

P2 优化

优化 1

若序列中有 100 100 100 1 1 1 ,然而任意多个 1 1 1 不会对子集积产生影响,我们只需要在方案数中乘以 2 100 2^{100} 2100 即可。

	...int sum = qpow(2, n);for(int i=1; i<=m; i++)sum -= (f[i] * qpow(2, cnt[1])) % mod,  sum = ((sum % mod) + mod) % mod;cout << sum;

优化 2

时间复杂度高的原因在于重复的计算:若有 100 100 100 2 2 2 ,我们会将第 2 , 3 2,3 2,3 2 2 2 、第 3 , 4 3,4 3,4 2 2 2 算了两次。我们应该只关心是几个 2 2 2 ,而不关心是哪几个 2 2 2

对于任意一个数 x x x ,设其出现了 t t t 次,我们可以对 x 1 , x 2 , . . . , x t x^1,x^2,...,x^t x1,x2,...,xt 分别计算,使用 x i x^i xi 计算贡献时乘以 C t i C_{t}^i Cti, 即 :

f j = ∑ i = 1 t ( f j x i × C t i ) f_j=\sum\limits_{i=1}^{t} ( f_{\frac {j} {x^i}} \times C_t^i) fj=i=1t(fxij×Cti) j j j x k x^k xk 的倍数)。

时间复杂度 O ( n ∑ i = 1 n ( log ⁡ a i m ) ) O(n \sum\limits_{i=1}^{n} (\log_{a_i}{m})) O(ni=1n(logaim)),最坏情况下 O ( n log ⁡ m ) O(n \log m) O(nlogm)

注意: 这里与多重背包的二进制拆分拆成多个物品不同,而是优化了对于一个物品的计算方式。

代码


http://www.ppmy.cn/news/63483.html

相关文章

vulnhub靶场之nasef1

1.信息收集 探测存活主机&#xff0c;发现192.168.239.176存活 对目标主机192.168.239.176进行端口扫描&#xff0c;发现存活22、80端口 浏览器访问http://192.168.239.176/&#xff0c;发现为apache2的页面&#xff0c;查看源码&#xff0c;未发现异常。 对http://192.16…

Hudi的precombine.field释疑

从不同资料&#xff0c;可看到四个让人迷惑的 precombine.field 配置项&#xff1a; precombine.field write.precombine.field hoodie.table.precombine.field hoodie.datasource.write.precombine.field 它们是完全相同&#xff0c;还是有什么关系了&#xff1f; hoodi…

PMP课堂模拟题目及解析(第6期)

51. 管理层将一个国际项目分配给一位新项目经理。这是该项目经理第一次与团队合作&#xff0c;团队成员位于两个国家&#xff0c;数量平均分布&#xff0c;一个团队由最合适作为个人工作的成员组成&#xff0c;另一个团队由最适合作为团队工作的成员组成。项目经理该怎么做&am…

双目测距--3 双目标定

目录 -1 流程说明&#xff1a; 0 几个重要 函数 1、calibrateCamera()函数 2、stereoCalibrate() 3、findChessboardCorners() 棋盘格角点检测 4、stereoRectify() 5、initUndistortRectifyMap() 6、remap() 1、用于标定的图像 2、标定前 3、OpenCV进行双目标定 单…

QT QFormLayout表单布局控件

本文详细的介绍了QFormLayout控件的各种操作&#xff0c;例如&#xff1a;新建界面、控件布局、添加控件、添加标签、标签插入、删除控件行、显示格式、总行数、列间距、行间距、行列间距、其它文章等等操作。 实际开发中&#xff0c;一个界面上可能包含十几个控件&#xff0c;…

对称加密与非对称加密、证书、SSL/TLS握手过程

文章目录 对称加密(Symmetrical Encryption)&#xff1a;非对称加密(Asymmetric Encryption)&#xff1a;区别&#xff1a;SSL证书TLS1.2握手过程 对称加密(Symmetrical Encryption)&#xff1a; 对称加密&#xff0c;是一种既简单速度又快的加密方式&#xff0c;加密与解密使用…

【MySQL】(5)聚合函数

文章目录 聚合函数COUNT 函数SUM 函数AVG 函数MAX 函数 MIN 函数 group by 子句简介示例&#xff1a;scott 数据库单列分组多列分组 having 子句总结 聚合函数 在 MySQL 中&#xff0c;聚合函数是用于计算多行数据的统计信息的函数&#xff0c;例如总和、平均值、最大值、最小…

C++之虚函数原理

对象数据和函数的存储方式 注意说的是对象。 C中的对象存储方式是 每个对象占用的存储空间只是该对象的数据部分&#xff08;虚函数指针和虚基类指针也属于数据部分&#xff09;&#xff0c;函数属于公共部分。 虚函数表 虚函数是通过虚函数表实现的。 C实现虚函数的方法是…