1. 程式人生 > >27E Number With The Given Amount Of Divisors(恰好有n個因子的數)

27E Number With The Given Amount Of Divisors(恰好有n個因子的數)

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;
}