CF27E Number With The Given Amount Of Divisors
题意:给定一个正整数 \(n\),输出最小的整数,满足这个整数有 \(n\) 个因子
solution
一道很多结论的题。
素数唯一分解定理
对于一个数 \(x\),我们可以将其唯一分解成 \(p_1^{c_1} \times p_2^{c_2} \times ... \times p_k^{c_k}=\prod_{i=1}^{k}p_i^{c_i}\)
,其中 \(p_i\) 为质数。
引理 1:
对于唯一分解 \(x = \prod_{i=1}^{k}p_i^{c_i}\) ,\(x\) 的因数个数为 \(\prod_{i=1}^{k}(c_i+1)\)
贪心
对一个具有 \(n\) 个因子的数来说,当因子个数不够的时候肯定是增加 \(\text{2}\) 的个数是更优的。
引理 2
对于一个含有 \(n\) 个因子的最小数 \(x = \prod_{i = 1}^{k} p_i^{c_i}\),如果 \(\forall i \in [1, k), p_i < p_{i + 1}\),那么可以证明:
- \(p_1 = 2\)
- \(p_{i + 1}\) 是 \(p_i\) 后面的第一个质数(即连续质数)
- \(\forall i \in [1, k), c_{i + 1} \leq c_i\)
首先题目保证答案不超过 \(10^{18}\),而 \(2^{64} > 10^{18}\),所以指数最多为 \(\text{64}\)。又因为从 \(\text{2}\) 开始连续 \(\text{16}\) 个质数相乘已经超过 \(10^18\),那么只需要搜 \(\text{16}\) 个质数,然后加上最优化剪枝以及一些特判即可。
注意爆 longlong 的情况也要剪掉。
/*
将 x 质因数分解
x = p_1^{c_1} + p_2^{c_2}....p_n^{c_n}
那么 x 的因子个数为 (c_1 + 1) * (c_2 + 1) * ...* (c_n + 1)
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXA = 1e4 + 5;
const int MAXB = 1e5 + 5;
const int MAXC = 1e6 + 5;
int read() {
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
return x * f;
}
int n, prime[30] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
int ans = 0x7f7f7f7f7f7f7f7f;
void dfs(int now, int k, int last, int cnt) {
if(cnt > n) return;
if(now <= 0ll) return ;
if(now > ans) return;
if(k > 16) return;
if(cnt == n) {ans = now; return ;}
for (int i = 1; i <= last; i++)
dfs(now *= prime[k], k + 1, i, cnt * (i + 1));
}
signed main() {
n = read();
dfs(1ll, 1, 64, 1);
printf("%lld", ans);
return 0;
}

浙公网安备 33010602011771号