Codeforces 1325E Ehab's REAL Number Theory Problem

Description

给一些数,每个的因数个数不超过 7,求最少选出多少个,使得乘积为完全平方。无解输出 1

Solution

「每个的因数个数不超过 7」看上去非常玄学,它的本质是什么?

唯一分解定理:任何一个大于 1 的自然数 N,可以唯一分解成有限个质数的乘积。即:

N=i=1npiki

这里 1in,ki1p1<p2<<pn,且 1in,piprime,正确性显然。

约数个数定理:任何一个大于 1 的自然数 N,它的约数个数为:

d(N)=i=1n(ki+1)

显然对于每一种质因子,都有选 0 个,选 1 个……选 ki 个共 (ki+1) 种选法,根据乘法原理,当然是它们的乘积。

好,我们用一下约数个数定理。设想 ai3 种质因数,那么 d(ai) 最小应当是 (1+1)3=8,和 d(ai)7 矛盾,所以,ai 至多有 2 种质因子。

所以,ai 要么是 1,要么可以表示为 p1k1 的形式,要么可以表示为 p1k1p2k2 的形式。不难发现把 k2 取模不会对答案造成影响,这是因为一个数本身的平方因子可以直接相消了。

现在,ai 只会是 1p1p1p2 三种可能了。

  • 如果一个 ai=1,直接输入 1,结束程序,因为直接选它就好了;
  • 如果一个 ai=p1,那么,建一条边,把 1p1 连起来;
  • 如果一个 ai=p1p2,那么,建一条边,把 p1p2 连起来。

注意 p 的值可能很大,需要离散化,可以在线性筛的时候预处理。

现在得到了一个图,答案就是这个图的 最小环 的大小。

为什么?选择一个数,就是选择一条边,如果我们选了一个环,那么环上的每个 pi 都有两条边相连,也就是乘了 2 次,那么这当然是一个完全平方数了!

106 以内质数大概是 78500 个,这个数字记作 P

用 Floyd 算法 O(P3) 求最小环是行不通的。

因为边权为 1,可以枚举起点然后 BFS,当然,这样直接做的复杂度是 O(nP),当然也是行不通的。(枚举起点 O(P),单次 BFS 是 O(n),因为有 n 条边)

深入剖析,发现 一个环内必然有一个点 maxai,这是因为不会有两个大于 maxai 的点之间有连边,只要这个较小数作为起点被枚举了,那么这个环就必然会被 BFS 到。所以,起点只要枚举到 maxai=103 即可。

当然,必然点都是质数,所以我们记 103 以内的质数个数为 P,这个算法的时间复杂度就是 O(nP),可以通过。

当然我的代码偷个懒是直接枚举到 maxai=103 的……

posted @   syksykCCC  阅读(343)  评论(2编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示