首页 > 技术文章 > 2020 Ateneo de Manila University DISCS PrO HS Division

JustinRochester 2021-05-11 22:17 原文

打这场的时候处于玄学状态,这 sb 题竟然搞了一个多小时

传送门

提供一个和题解不同的方法


【题意】

若给定正整数 \(n\) ,可以将其所有因数累乘,得到 \(m\)

现给定 \(m\) ,问是否存在该 \(n\)

\(m\leq 10^{15}\)


【分析】

\(\displaystyle n=\prod_i p_i^{k_i}\) 的因数个数为 \(\displaystyle \boldsymbol d(n)=\prod_i (1+k_i)\)

\(\displaystyle m=\prod_i (\prod_{j=1}^{k_i} p_i^j)^{\prod_{j\neq i}(1+k_j)}=\prod_i (p_i^{k_i(k_i+1)\over 2})^{\boldsymbol d(n)\over k_i+1}=(\prod_i p_i^{k_i})^{\boldsymbol d(n)\over 2}=n^{\boldsymbol d(n)\over 2}\)

\(m^2=n^{\boldsymbol d(n)}\)

现在进行分类讨论:

\(\boldsymbol d(n)\geq 5\) 时,由于 \(m\leq 10^{15}\) ,故 \(n\leq m^{2\over 5}\leq 10^{15\cdot {2\over 5}}=10^6\)

因此,我们可以先枚举倍数,用 \(O(n\log n)\) 的时间对 \(n\leq 10^6\) 的数字进行打表,之后暴力查表,查找是否存在 \(n^{\boldsymbol d(n)}=m^2\)

\(\boldsymbol d(n)=1\)\(n=1\) 得出 \(m=1\),直接验证

\(\boldsymbol d(n)=2\)\(n\in Prime\) 得出 \(m=n\)\(O(\sqrt m)\) 验证

\(\boldsymbol d(n)=3\)\(n=p^2, p\in Prime\Rightarrow m^2=n^3=p^6\Rightarrow m=p^3\)

\(p=m^{1\over 3}\leq 10^5\) ,暴力枚举 \(O(m^{1\over 3})\) 验证

\(\boldsymbol d(n)=4\)\(m^2=n^4\to n=\sqrt m\) ,先验证 \(\sqrt m\) 是否为整数;之后根据 \(d(n)=4\) 得出 \(n=p^3\wedge n=pq, p\neq q\wedge p,q \in Prime\)

由于 \(n=\sqrt m\leq 10^{7.5}\) ,故直接 \(O(\sqrt n)\) 枚举最小质因数 \(i\)

\(n=i^3\) 则得出答案;否则判定是否 \(n=i^2\) 而不满足题意;最后 \(O(\sqrt n)\) check \({n\over i}\) 是否为质数

推荐阅读