Loading

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}\),那么可以证明:

  1. \(p_1 = 2\)
  2. \(p_{i + 1}\)\(p_i\) 后面的第一个质数(即连续质数)
  3. \(\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;
}


posted @ 2021-10-28 11:18  Dita  阅读(35)  评论(0编辑  收藏  举报