题目描述

定义 $f(x)$ 表示 $x$ 分解质因数后得到的质数个数
给定一个数 $n$,求是否存在一个数 $m (1 < m < n)$,使得 $f(m) > f(n)$。

解题思路

先看一下数据范围,$1\leq T\leq 10^4$,$2\leq n\leq 10^{18}$,暴力肯定 TLE,我们需要考虑一种复杂度较低的算法。

根据小学学过的知识可知,分解质因数得到的数字一定是质数,我们可以枚举一部分数字的答案,找找其中的规律。

算出答案后,我们去除 $1$ 的情况,只考虑为 $f(m) > f(n)$ 为 false 的情况,得到一个数列,观察数列发现只有 $x$ 格式为 $2^n$ 或者 $3 \times 2^n$ 时 $f(m) > f(n)$ 才不成立,得到结论后,这道题就很简单了。

注意要开 long long !!!

程序实现

如何判断 $x$ 格式为 $2^n$ 或者 $3 \times 2^n$ 呢?我们可以使用 cmath 自带的 log2() 函数,如果 $\log2(x)$ 后是整数,那它的格式一定是 $2^n$。如果 $\log2(\dfrac{x}{3})$ 后是整数,那它的格式一定是 $3 \times 2^n$。

#include <iostream>
#include <cmath> // log2() 函数需要的头文件

typedef long long ll; // 不开 long long 见祖宗!

int main()
{
    long long t, n;
    std::cin >> t;
    while (t--)
    {
        std::cin >> n;
        double x1 = log2(n);
        double x2 = log2(n / 3.0); // 注意处理精度问题!
        if (x1 == (ll)x1 || x2 == (ll)x2)
            puts("0");
        else
            puts("1");
    }
    return 0;
}
最后修改:2022 年 04 月 03 日
赠人玫瑰,手有余香。您的赞赏是对我最大的支持!