主要思路:
- 素因子累乘並利用題目限制條件更新答案.
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
int primes[26]={0,2,3,5,7,11,13,17,19,23,29,31,37},primeCnt=12;//質數表
int maxNum=-1,maxValue=-1;//最多的約數數量 最大反素數
int n;
void dfs(ll nowValue,ll nowNum,int nowIndex){//當前總值 當前約數數量 當前位於哪個質數
if(nowNum>maxNum){//如果約數數量更多則直接更新
maxNum=nowNum;
maxValue=nowValue;
}else if(nowNum==maxNum&&nowValue<maxValue)maxValue=nowValue;//約數數量相同的情況下優先選擇儘量小的數
for(int i=nowIndex;i<=primeCnt;i++){
ll key=1;//當前質數乘方(多次)後的值
int tmp=1;
while(1){
key*=primes[i];//當前質數乘方(多次)後的值
if(nowValue*key>n)break;//如果總值超過n了則結束循環
dfs(nowValue*key,nowNum*(tmp+1),i+1);//合法則繼續遞歸
tmp++;
}
}
}
int main(){
scanf("%d",&n);
dfs(1,1,1);//當前值爲1,約數數量爲1,位於第1個素數.
printf("%d\n",maxValue);
return 0;
}