[BZOJ 1053] Anti-prime

题意

  记 $g(x)$ 为 $x$ 的约数个数.

  定义 Anti-prime : 对于 $x \in \mathbb{Z} ^ +$ , 若 $\forall i \in (0, x)$ , $g(x) > g(i)$ , 则称 $x$ 为一个 Anti-prime .

  给定一个数 $N(N \le 2 \times {10} ^ 9)$ , 求 $\max_{x \le N, x 是 Anti-prime}x$ .

分析

  我们尝试找到 Anti-prime 的一些性质, 以更好地求解这个问题.

  Anti-prime 与约数个数有关, 我们尝试利用唯一分解, 来进行分析.

  设一个 Anti-prime $x = \prod_{k = 1} ^ m {a_k} ^ {p_k}$ .

  不妨令 $a_1 < a_2 < ... < a_m$ .

  基本地, 有 $g(x) = \prod_{k = 1} ^ m (p_k + 1)$ .

  我们发现, 经过了唯一分解之后, 我们有两类量 $\left\{ a_1, a_2, ..., a_m \right\}$ 和 $\left\{ p_1, p_2, ..., p_m \right\}$ .

  直接探究没有任何的结果, 我们尝试控制变量.

  当 $p_1, p_2, ..., p_m$ 一定, 考虑 $a_1, a_2, ..., a_m$ 要满足什么条件.

  此时 $g(x)$ 已经确定为 $\prod_{k = 1} ^ m (p_k + 1)$ .

  根据 Anti-prime 的定义, $\forall y < x, g(y) < g(x)$ , 所以 $x$ 应该是指数为 $p_1, p_2, ..., p_m$ 的最小的数.

  所以要求 $a_1, a_2, ..., a_m$ 取前 $m$ 个素数.

  而注意到 $N \le 2 \times {10} ^ 9$ , 也就是说只会利用到前面的 $10$ 个素数.

  当我们取了前 $m$ 个素数 $2, 3, 5, 7, 11, ...$ 的时候, 考虑 $p_1, p_2, ..., p_m$ 要满足什么条件.

  我们一定有 $p_1 \ge p_2 \ge p_3 \ge ... \ge p_m$ , 否则可以通过交换, 构造更小且约数个数相同的数.

  总之, 我们得到了两个 Anti-prime 的性质:

    ① $a_1, a_2, ..., a_m$ 取前 $m$ 个素数.

    ② $p_1 \ge p_2 \ge ... \ge p_m$ .

  现在考虑求解问题.

  $$\begin{aligned} 一个数 x 是 N 以内最大的 Anti-Prime & \Leftrightarrow \forall y > x, g(y) \le g(x) , \forall y < x, g(y) < g(x) \\ & \Leftrightarrow x 是 N 以内约数个数最大的最小的数 \end{aligned}$$ .

  我们利用之前探究出来的两个性质, 暴力地进行枚举, 然后取约数个数最大的最小的数即可.

实现

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <algorithm>
using namespace std;

#define LL long long

const int p[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};

LL n;
LL D, N;

void Search(int dep, int lim, LL div, LL num) {
    if (dep == 10) {
        if (div > D || (div == D && num < N))
            D = div, N = num;
        return;
    }
    LL M = 1;
    for (int i = 0; i <= lim && num * M <= n; i++) {
        Search(dep+1, i, div * (i+1), num * M);
        M *= p[dep];
    }
}

int main(void) {
    #ifndef ONLINE_JUDGE
        freopen("bzoj1053.in", "r", stdin);
        freopen("bzoj1053.out", "w", stdout);
    #endif

    scanf("%lld", &n);
    Search(0, 35, 1, 1);
    printf("%lld\n", N);

    return 0;
}
时间: 2024-11-03 22:51:13

[BZOJ 1053] Anti-prime的相关文章

BZOJ 1053 反素数

Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? Input 一个数N(1<=N<=2,000,000,000). Output 不超过N的最大的反质数. Sample Input 1000 Sample Output 840 HINT Source 开始没有想清楚这

[BZOJ 1053] [HAOI 2007]反素数ant

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1857  Solved: 1034[Submit][Status][Discuss] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么?

bzoj 1053: [HAOI2007]反素数ant 搜索

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1497  Solved: 821[Submit][Status] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? Input 一个数N

【BZOJ 1053】 1053: [HAOI2007]反素数ant (反素数)

1053: [HAOI2007]反素数ant Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么 ? Input 一个数N(1<=N<=2,000,000,000). Output 不超过N的最大的反质数. Sample Input 1000 Sample Output

【HAOI 2007】【BZOJ 1053】反素数ant

虽然这题很水,但蒟蒻还是想了很久. 首先由一个很显然的结论,这题只会用到10个质数. 一个感性的证明: 设有一数x=pk11+pk22+...+pkmm 那么我们现在要给x乘上一个质数,使它的约数数目最多且相对较小. 显然我们我们要乘第1≤i≤m+1个质数,如果乘再靠后的质数,显然不如乘第m+1个更优. 于是我们看到2?3?5?7?11?13?17?19?23?29=6469693230>2?109 所以只需要10个质数. 然后想了很久继续用数学方法做,无果,后来发现其实是搜索= = code:

[BZOJ 1053][HAOI2007]反素数ant

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1053 这个题很有意思,虽然代码很短,但是思路非常巧妙. 首先这个题问不超过N的最大的x,使得任何比x小的数的约数个数都比x的约数个数少.其实说到底就是求[1,n]中约数个数最多的数,如果有多个这样的数,取最小的(因为题目要求任何比x小的数的约数个数都必须小于x的约数个数,不能取等).另外做这题之前还要掌握约数个数公式:若把x表示成多个质因数的乘积,x=p1^a1*p2^a2*..

BZOJ 1053 HAOI2007 反素数

1.一个数的约数个数=所有素因子的幂次+1的乘积这个直观的理解就是 2^x*3^y 我能拆出来 2^0*3^02^0*3^12^0*3^2……2^1*3^02^1*3^1……2^2*3^0……2^x*3^0……2^x*3^y根据乘法原理 2一共有x+1个幂 3有y+1个幂 所以就是(x+1)*(y+1) 2.写一个暴力跑程序会发现一个2000000000以内的数字不会有超过12个素因子 3.较小的数的幂次一定大于等于较大的数的幂次 之后就是赤裸裸的DFS暴搜了 1 #include <cstdi

【BZOJ 1053】[HAOI2007]反素数ant

Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? Input 一个数N(1<=N<=2,000,000,000). Output 不超过N的最大的反质数. Sample Input 1000 Sample Output 840 他们说2*10^9内的数符合条件的素因子

【BZOJ】【1053】【HAOI2007】反素数ant

搜索 经典搜索题目(其实是蒟蒻只会搜……vfleaking好像有更优秀的做法?) 枚举质数的幂,其实深度没多大……因为$2^32$就超过N了……而且质数不能取的太大,所以不会爆…… 1 /************************************************************** 2 Problem: 1053 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:40 ms 7 Memory:1760 k