代码:
//本题要求不超过n的因子最多的最小的数,我们知道因子的个数可以有素因子的指数得出,题目限制n是2e9,我们可以排除掉一些情况然后暴力 //对于一个数必然是因子越小他的因子数越多,所以枚举最小的前10个素数作为n的素因子(乘积超过了2e9),暴力dfs,因为是找最小的所以 //小的因子的个数必然大于等于大的因子的个数。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int INF=0x7fffffff; int n,ans,sum; int p[11]={2,3,5,7,11,13,17,19,23,29}; void dfs(int i,int num,int cnt,int last) { if(i==10){ if(cnt>sum){ sum=cnt; ans=num; }else if(cnt==sum&&num<ans) ans=num; return; } ll tmp=num; for(int j=0;j<=last&&tmp<=n;j++){ dfs(i+1,tmp,cnt*(j+1),j); tmp*=p[i]; } } int main() { scanf("%d",&n); ans=INF;sum=0; dfs(0,1,1,30); printf("%d ",ans); return 0; }