以前我们求一个数的所有因子也是用搜索,比如,以每一个
为树的一层建立搜索树,深度为
以为例进行说明,建树如下:
可以看出从根节点到每一个叶子结点这条路径上的所有数字乘起来都是12的约数,所以12有6个约数。
#include <cstdio>
long long INF = -1;
int n, ans, num, best;
int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
void dfs(int dept, int tmp, int num)
{
if(dept >= 16)return;//超过15部,退出
if(num > best)// 因数个数更多,更新
{
best = num;
ans = tmp;
}
if(num == best && ans > tmp) ans = tmp;//因数个数相同,取较小的数字
for ( int i = 1; i <= 63; i++)
{
if(n / p[dept] < tmp) break; //后面的tmp会比n大,退出
dfs(dept + 1, tmp *= p[dept], num*(i+1)); //步数加1
}
}
int main()
{
n = 600000;
while(1)
{
best = ans = -1;
dfs(0,1,1);
n = ans;
printf("%d ",n);
n--;
if(n == 1)break;
}
}