27E Number With The Given Amount Of Divisors(恰好有n個因子的數)
阿新 • • 發佈:2018-12-13
Given the number n, find the smallest positive integer which has exactly n divisors. It is guaranteed that for the given n the answer will not exceed 10^18. Input The first line of the input contains integer n (1 ≤ n ≤ 1000).
Output Output the smallest positive integer with exactly n divisors.
題意:求一個最小的數x,其恰好有n個因子. 思路:因為每選擇一個素數作為因子,因子個數都至少乘2,所以遞迴層數不超過10幾層,直接dfs即可. 我是按照反素數的寫法寫的,因為這樣可以保證因子儘量得多,更快的到達我們的目標因子數. 程式碼:
#include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn = 2e5+5; ll n,ans; int pri[1234],is_prime[1234]; void init() { int cnt = 0; for(int i = 2;i<= 500;i++) { if(!is_prime[i]) { pri[++cnt] = i; for(int j = i*i;j<= 500;j+= i) is_prime[j] = 1; } } return ; } void dfs(int x,ll m,int sum,int limit) { if(sum> n) return ; if(sum == n) { if(ans == 0) ans = m; else ans = min(ans,m); return ; } for(int i = 1;i<= limit&&m<= 1000000000000000000;i++) { m*= 1ll*pri[x]; dfs(x+1,m,sum*(i+1),i); } return ; } int main() { init(); cin>>n; dfs(1,1,1,100); cout<<ans<<endl; return 0; }