题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1562
题 意:找出小于n且因子数最多的数。
思 路:一个数 A 可以分解成 p1k1 * p2k2 * …… * pnkn 其中p为素数。这样分解之后,A的因子个数S = (k1+1) *( k2+1) * …… *( kn+1)然后用dfs枚举 + 剪枝可以得到s的值。可以在枚举所有小于n的A的s值,最后得到最大值。
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <climits>
#include <algorithm>
typedef long long LL;
LL ans;
LL ans1;
LL n;
const LL pr[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
void DFS( LL k, LL num, LL now )
{
if( k >= 16 ) return;
if( now > n ) return;
if( num > ans && now <= n )
{
ans = num;
ans1 = now;
//return;
}
if( ans == num && ans1 > now ) ans1 = now;
for( int i = 1; i <= 64; i ++ )
{
if( now * pr[k] <= n )
{
DFS( k+1, num*(i+1), now*=pr[k] );
}
else break;
}
}
const LL MAX = 1e18+9;
int main()
{
while( scanf ( "%lld", &n ) != EOF )
{
ans = 0;
ans1 = MAX;
DFS(0,1,1);
printf("%lld\n",ans1);
}
return 0;
}