反素数

一个数约数的个数就是所有质因子的指数+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 } 
原文地址:https://www.cnblogs.com/lcan/p/9898272.html