题解:QOJ9619/洛谷13568 [CCPC 2024 重庆站] 乘积,欧拉函数,求和(数论+状压DP)

news/2025/9/27 15:38:53/文章来源:https://www.cnblogs.com/XiaoQuQu/p/19115182

首先将 \(\phi(x)\) 拆成 \(\phi(x)= x \prod_{p | x} \frac {p-1}{p}\),发现我们要求的式子其实可以转化为 \(\sum_{S} (\prod a_i)\prod_{p|\prod a_i} \frac {p-1}{p}\)

发现其实我们只关心哪些质数 \(p\) 在最终的乘积里出现了,于是考虑记一个集合 \(S\) 表示出现了的质数。令 \(f_{i,S}\) 表示考虑前 \(i\) 个数,最后乘积出现的质数集合为 \(S\)\(\prod a_i\) 之和,答案就是 \(\sum_S f_{n,S} \prod_{p\in S} \frac {p-1}{p}\)。转移的时候考虑 \(a_{i+1}\) 是否选入乘积:

  1. 如果选择,则 \(f_{i,S} \times a_{i+1} \to f_{i+1,S\cup T}\)
  2. 如果不选,则 \(f_{i,S}\to f_{i+1,S}\)

但是 \(3000\) 以内的素数有 \(430\) 个,我们显然不能全都记进 \(S\) 里面。分析一下,发现有很多状态是无效的:一个不超过 \(V\) 的整数,它最多只有一个大于 \(\sqrt V\) 的因子。所以,\(S\) 中大于 \(\sqrt V\) 的数最多只能有一个。

注意到小于 \(\sqrt V\) 的素数只有 \(16\) 个,所以我们不妨将所有数按照他的大于 \(\sqrt V\) 的因子(下方记为 \(F(x)\))分组,记 \(f_{i,1/0,S}\) 表示考虑前 \(i\) 个数,当前这个数的 \(F(x)\) 有/没有被选进乘积,\(< \sqrt V\) 的素数选了集合 \(S\)\(\prod a_i\) 之和。在转移的过程中,对于 \(F(x)\),我们其实可以直接把贡献算进 \(f\) 里:

  1. 如果 \(F(a_{i+1})=F(a_i)\),即这两个是一组的,则:
    1. 如果 \(a_{i+1}\) 不选,\(f_{i,0/1,S}\to f_{i+1,0/1,S}\)
    2. 如果 \(a_{i+1}\) 选,则考虑 \(a_i\) 是否选择:\((f_{i,0,S} \times \frac {F(a_{i+1})-1}{F(a_{i+1})}+f_{i,1,S}) \times a_{i+1} \to f_{i+1,1,S\cup T}\)
  2. 如果 \(F(a_{i+1})\ne F(a_i)\),则:
    1. 如果 \(a_{i+1}\) 不选,\(f_{i,0,S}+f_{i,1,S}\to f_{i+1,0,S}\)
    2. 如果 \(a_{i+1}\) 选,则 \((f_{i,0,S}+f_{i,1,S}) \times a_{i+1} \times \frac {F(a_{i+1})-1}{F(a_{i+1})} \to f_{i+1,1,S\cup T}\)

再判一下如果 \(a_{i+1}\) 没有大于 \(\sqrt V\) 的因子,则按照上面最开始的方式转移即可。

最后时间复杂度 \(O(2^{16}n\times 414)\)

const int MAXN = 2e3 + 5, MAXV = 3e3 + 5, mod = 998244353;
const int p[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
int n, f[2][2][1ll<< 17], inv[MAXV];
struct _node {int val, S, P;
} a[MAXN];void add(int &x, int y) {x = (x + y) % mod;
}int quickpow(int x, int y) {int ret = 1;while (y) {if (y & 1) ret = ret * x % mod;x = x * x % mod;y >>= 1;}return ret;
}void work() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i].val;a[i].P = a[i].val;for (int j = 0; j < 16; j++) {if (a[i].P % p[j] == 0) {a[i].S |= (1 << j);while (a[i].P % p[j] == 0) a[i].P /= p[j];}}if (a[i].P > 1) inv[a[i].P] = quickpow(a[i].P, mod - 2);else a[i].P = 0;}for (int i = 0; i < 16; i++) {inv[p[i]] = quickpow(p[i], mod - 2);}sort(a + 1, a + 1 + n, [](auto x, auto y) {return x.P < y.P;});f[0][0][0] = 1;for (int i = 0; i < n; ++i) {memset(f[i & 1 ^ 1], 0, sizeof(f[i & 1 ^ 1]));for (int S = 0; S < (1ll << 16); ++S) {if (a[i + 1].P == 0) {add(f[i & 1 ^ 1][0][S], f[i & 1][0][S]);add(f[i & 1 ^ 1][0][S | a[i + 1].S], f[i & 1][0][S] * a[i + 1].val % mod);continue;}if (a[i + 1].P == a[i].P) {add(f[i & 1 ^ 1][0][S], f[i & 1][0][S]);add(f[i & 1 ^ 1][1][S], f[i & 1][1][S]);add(f[i & 1 ^ 1][1][S | a[i + 1].S], f[i & 1][0][S] * a[i + 1].val % mod * (a[i + 1].P - 1) % mod * inv[a[i + 1].P] % mod);add(f[i & 1 ^ 1][1][S | a[i + 1].S], f[i & 1][1][S] * a[i + 1].val % mod);} else {add(f[i & 1 ^ 1][0][S], f[i & 1][0][S]);add(f[i & 1 ^ 1][0][S], f[i & 1][1][S]);add(f[i & 1 ^ 1][1][S | a[i + 1].S], f[i & 1][0][S] * a[i + 1].val % mod * (a[i + 1].P - 1) % mod * inv[a[i + 1].P] % mod);add(f[i & 1 ^ 1][1][S | a[i + 1].S], f[i & 1][1][S] * a[i + 1].val % mod * (a[i + 1].P - 1) % mod * inv[a[i + 1].P] % mod);}}}int ans = 0;for (int S = 0; S < (1ll << 16); ++S) {int cof = 1; for (int i = 0; i < 16; ++i) {if (S >> i & 1) cof = cof * (p[i] - 1) % mod * inv[p[i]] % mod;}add(ans, f[n & 1][0][S] * cof);add(ans, f[n & 1][1][S] * cof);}cout << ans << endl;
}

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

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

相关文章

Momentum Gradient Descent(动量梯度下降)

Momentum Gradient Descent(动量梯度下降)是标准梯度下降(SGD)的一个重要改进版,旨在加速训练过程,并帮助模型更有效地找到最优解。 你可以将动量(Momentum)想象成物理学中的惯性。动量梯度下降(Momentum GD)…

Halcon算子——2D几何变换

齐次坐标 介绍仿射变换前,先介绍什么是齐次坐标。对于一个平面像素点,我们可以通过坐标(x,y)描述其位置。但是当涉及平移时,如果仅仅使用它对应的坐标向量[x,y],就必须通过向量加法来描述其位移。 而齐次坐标的引入…

深入解析:深度解析 CUDA-QX 0.4 加速 QEC 与求解器库

深入解析:深度解析 CUDA-QX 0.4 加速 QEC 与求解器库pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

网站建设360网站建设优化汕头

Plupload有以下功能和特点&#xff1a; 1、拥有多种上传方式&#xff1a;HTML5、flash、silverlight以及传统的<input type”file” />。Plupload会自动侦测当前的环境&#xff0c;选择最合适的上传方式&#xff0c;并且会优先使用HTML5的方式。所以你完全不用去操心当前…

电子商务网站开发意义深圳商业网站建设案例

“工作三年&#xff0c;并不等于拥有三年的工作经验。”这句话告诉我们每天都要思考自己当天所遇到的问题&#xff0c;记录下来&#xff0c;并且思考这个问题的解决办法&#xff0c;每一周或两周总结这些问题和解决办法&#xff0c;归纳思考问题根源&#xff0c;学习解决问题的…

Pytest+requests进行接口自动化测试6.0(Jenkins) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025钉螺,花螺,田螺,香辣麻辣钉螺,捞汁钉螺,鲜活钉螺,无沙去尾钉螺厂家推荐榜单:全链条生产 + 北部湾原料,破解沙臭空壳痛点钉螺工厂选购指南!

钉螺作为餐饮市场的热门食材,其品质与供应稳定性直接影响餐饮门店的口碑与运营效率。然而当前行业仍面临多重痛点:原料含沙量高导致口感粗糙,臭螺、空壳问题频发拉低菜品品质,部分产品因加工工艺不佳出现 “不好吸…

insta go2 对比vivo x100pro超广角

go2 画面比例 镜头视角 横向 FOV 纵向 FOV 对角线 FOV16:9 画面比例 超广角 116.6 69.9 127.8 1/2.3英寸CMOS 拍照分辨率3040*3040(圆形视场),处理后最高为2560x2560=655万go3相比于go2 由于cmos没变,分辨率略有提…

深圳罗湖网站开发wordpress产品数量

采集k8s挂载Nas后的日志 该文档主要介绍使用logtail以两种不同的方式进行k8s挂载Nas后的日志采集。两种采集方式的实现原理是一样的&#xff0c;都是通过将Logtail和业务容器挂载到相同的NAS上&#xff0c;使Logtail和业务容器的日志数据共享&#xff0c;以此实现日志采集。下…

《C++程序设计》笔记p4 - 指南

《C++程序设计》笔记p4 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

无锡市滨湖区建设局网站网站实名审核

ONLYOFFICE 协作空间是一个在线协作平台&#xff0c;帮助您更好地与客户、业务合作伙伴、承包商及第三方进行文档协作。今天我们来介绍一下&#xff0c;如何在 Windows 上安装协作空间的自托管版。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&a…

ProjectLibre

ProjectLibreProjectLibre工程软件

解析01背包 - 教程

解析01背包 - 教程2025-09-27 15:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

电脑显示器黑屏(闪烁:隔几秒中黑一两秒),向日葵远程正常——DeepSeek问答

这个问题非常深入,答案比“非此即彼”要复杂一些,因为它取决于具体的系统配置和硬件架构。总的来说,有两种主要情况。 1. “桌面画布”位于哪里?(显存 vs 主内存) 这主要取决于您使用的是独立显卡 还是集成显卡。…

夜场建设网站重庆网络技术有限公司

单例模式一般分为懒汉模式和饿汉模式&#xff0c;懒汉式单例在第一次引用时创建实例&#xff0c;不是在类加载时&#xff1b;饿汉式单例模式是一种在类加载时就创建实例的方式&#xff0c;因此也称为静态初始化。 单例模式实现的技巧时构造私有&#xff0c;向外提供静态实例。…

企业网站 dede phpcms 帝国团队建设网站

1、Configuration Bean 2、Compoent ComponentScan Component标记了&#xff0c;哪些类需要被扫描&#xff0c;ComponentScan指定了哪些包路径下的标记类可以被扫描 Component 如果不指定范围&#xff0c;默认从启动类所在包开始&#xff0c;扫描当前包及其子级包下的所有文…

实用指南:iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动

实用指南:iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

深入解析:Tomcat

深入解析:Tomcatpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Cou…

做类似淘宝网站怎么做专业3合1网站建设电话

前段时间&#xff0c;小灰发布了红黑树相关的文章&#xff0c;分成上下篇来讲解。这一次&#xff0c;小灰把两篇文章做了整合&#xff0c;并且修正了红黑树删除部分的图片错误&#xff0c;感谢大家的指正。————— 第二天 —————————————————二叉查找树&a…

消息队列Apache Kafka教程 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …