Codeforces 27E Number With The Given Amount Of Divisors (求約數個數為n的最小數)
Number With The Given Amount Of Divisors
time limit per test:2 seconds
memory limit per test:256 megabytes
題目連結:http://codeforces.com/problemset/problem/27/E
題目大意:給一個數字n,求一個最小的數使得它的約數個數為n
題目分析:答案不超過1e18,首先假設每個素數都是一次冪,則前17個素數相乘就超出範圍了,因此只需要取前16個素數,其次對於最小的素數2,2的63次方剛好是範圍內的臨界值,因此,只需要列舉DFS即可,三個引數pos表示當前素數,val表示當前數值,num表示當前數字約數的個數,注意幾個剪枝,當val *p[pos] > ans或者約數個數已經大於n時,直接break,因為素數表是從小到大的,又因為要求約數個數恰好為n,因此如果num*(i + 1)不是n的約數,也不會得到n,就不用繼續搜了
Given the number n, find the smallest positive integer which has exactlyn divisors. It is guaranteed that for the givenn the answer will not exceed 1018.
Input
The first line of the input contains integer n (1 ≤ n ≤ 1000).
Output
Output the smallest positive integer with exactlyn divisors.
Sample test(s)
Input
4
Output
6
Input
6
Output
12
題目連結:http://codeforces.com/problemset/problem/27/E
題目大意:給一個數字n,求一個最小的數使得它的約數個數為n
題目分析:答案不超過1e18,首先假設每個素數都是一次冪,則前17個素數相乘就超出範圍了,因此只需要取前16個素數,其次對於最小的素數2,2的63次方剛好是範圍內的臨界值,因此,只需要列舉DFS即可,三個引數pos表示當前素數,val表示當前數值,num表示當前數字約數的個數,注意幾個剪枝,當val *p[pos] > ans或者約數個數已經大於n時,直接break,因為素數表是從小到大的,又因為要求約數個數恰好為n,因此如果num*(i + 1)不是n的約數,也不會得到n,就不用繼續搜了
#include <cstdio>
#include <iostream>
#define ull unsigned long long
using namespace std;
ull n, ans;
int p[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
void DFS(int pos, ull val, ull num)
{
if(num > n || pos > 15)
return;
if(num == n)
{
ans = min(ans, val);
return;
}
for(int i = 1; i <= 63; i++)
{
if(val > ans / p[pos] || num * (i + 1) > n)
break;
val *= p[pos];
if(n % (num * (i + 1)) == 0)
DFS(pos + 1, val, num * (i + 1));
}
return;
}
int main()
{
cin >> n;
ans = 1ull << 63;
DFS(0, 1, 1);
cout << ans << endl;
}
相關文章
- 杭電OJ 2028求n個數的最小公倍數
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- 求多個數最大公約數、最小公倍數的一種變換演算法演算法
- java求一個整數的最小因子Java
- 3516 求n個整數的最小值 迴圈結構
- 最大公約數和最小公倍數
- 3069 求n個整數的和
- C語言 用更相減損術求最大公約數,最小公倍數C語言
- 一個數number的n次冪 python的pow函式Python函式
- POJ 2442-Sequence(優先佇列-m組n個數每組取一個求n個最小值)佇列
- C++:最小公倍數與最大公約數C++
- Python求最小公倍數Python
- 最大公約數和最小公倍數--java實現Java
- 最大公約數與最小公倍數演算法演算法
- HDU 4279 2012網路賽Number(數論 尤拉函式結論約數個數)函式
- 求一個數的最大公約數的三種思路——解題筆記筆記
- python語言程式設計——求最大公約數和最小公倍數演算法Python程式設計演算法
- 數論線性篩總結 (素數篩,尤拉函式篩,莫比烏斯函式篩,前n個數的約數個數篩)函式
- YT14-HDU-求N^N的個位數(暴力破解版)
- C#--求三個數的最大數C#
- 演算法設計與分析:求兩個自然數的最大公約數演算法
- # 2024_8_4 求單調上升總和為n的數列的方案數
- 歐幾里德演算法(又稱輾轉相除法)求最大公約數,以及最小公倍數演算法
- k個最小和;及數對數目分析
- 求一個陣列中沒有出現的最小正數陣列
- linux C(hello world)最大公約數和最小公倍數Linux
- 面試官:來寫個程式碼求一下兩個數的最大公約數吧面試
- 指標-n個數的排序指標排序
- 引數為二叉樹和一個整數,求所有和為該整數的路徑二叉樹
- 求陣列中未出現的最小正整數陣列
- 【JAVA習題六】輸入兩個正整數m和n,求其最大公約數Java
- 【shell 指令碼】求最大公約數指令碼
- java求最小公倍數(親測秒懂)Java
- 求無序陣列總第n大的數陣列
- 【c語言】求兩個數中不同的位的個數C語言
- 給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。陣列
- php判斷二個數最大公約數PHP
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法