样例输入
3
10
100
1000
样例输出
6
60
840
最重要的一个公式:
例如数字6可以分解为21 * 31,所以按照公式,它的因数个数为4(1,2,3,6)。
由于任何合数都可以被分解为质数之积的形式,所以我们可以只选用质数进行求解。
这里选用16个质数(15个质数的积就已经超过1016了)。
对于剪枝,由于求得是最小的那个,所以我们设定一个m,对于每一个质数的次数都不会超过上一个选择的质数的次数。
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
long long n;
long long ansn,ansc;
int a[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,49};
void dfs(long long sum,long long cnt,int u,int m){
if(cnt>ansc){
ansc=cnt;
ansn=sum;
}else if(cnt==ansc&&ansn>sum){
ansn=sum;
}
if(u==16)return;
long long x=sum;
for(int i=1;i<=m;i++){
x*=a[u];
if(x>n)break;
dfs(x,cnt*(i+1),u+1,i);//套用公式
}
}
int main(){
int T;
cin >> T;
while(T--){
cin >> n;
ansc=0;
ansn=0;
dfs(1,1,0,60);//就算是2^60次方就已经超过n10^16
cout << ansn << endl;
}
return 0;
}