ZJU 2562 More Divisors (反素数)

来源:互联网 发布:人工智能的伦理困境 编辑:程序博客网 时间:2024/05/22 10:12

题目链接: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;}

0 0
原创粉丝点击