一个数约数的个数就是所有质因子的指数+1的积
因为一般来说,质因子小的越多越好,所以2,000,000,000的质因子可以枚举到前12个质数
有一个小剪枝就是质因子越小越好,所以后面质数的指数小于等于前面的指数
还有,这样的搜索...
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 typedef long long ll; 8 ll pri[20]={0,2,3,5,7,11,13,17,19,23,29,31,37}; 9 ll n,ans=1,ret=1; 10 void dfs(ll k,ll num,ll cnt,ll last){ 11 if(k==12){ 12 if(num>ret&&cnt>ans){ret=num;ans=cnt;} 13 if(num<=ret&&cnt>=ans){ret=num;ans=cnt;} 14 return; 15 } 16 ll tmp=1; 17 for(ll i=0;i<=last;i++){ 18 dfs(k+1,num*tmp,cnt*(i+1),i); 19 tmp*=pri[k]; 20 if(num*tmp>n) break; 21 } 22 } 23 int main(){ 24 cin>>n; 25 dfs(1,1,1,20); 26 cout<<ret<<endl; 27 }