认识反素数

定义:对于任何正整数x,其约数的个数记做g(x)。例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x) , 都有g(i)<g(x),则称x为反素数。
性质:
(1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数尽量小
(2)同样的道理,如果:p=2^t1*3^t2* 5^t3*7^t4…..,那么必有t1>=t2>=t3>=….

引题:给定一个数n,求一个最小的正整数x,使得的约数个数为n。

那么我们所要求的就是g(x) = n,且在0到x之间都有g(i)<g(x),这样x才可以保证最小。之后就是如何去求一个数的约数个数啦,如下图
下面关于12的约数的图
因此可以知道从根节点带叶子节点的总的路径数就是12的总约数个数。那么我们再求一个数的约数个数时的根本就是计算这个树的路径总数,用搜索来解决,代码如下

void dfs(int i, int lim, ll base, int num) //其中i为搜索到第几层,也就是在搜索prime[i]这个素数。lim是当前这个素数指数的最大值。base是当前值。num是当前值base的约数个数。
{
    if(num > n) return ;  //当约数个数大于所求n时,返回空
    if(num == n && ans > base) ans = base; 
    for(int j = 1; j <= lim; j++) //依据是性质2
    {
        if(ans/prime[i] < base || num*(j+1) > n) return ; //若base*prime[i]大于ans时就不用继续dfs下去,因为要保证ans为最小值。或当约数个数大于所求约数个数n是也停止搜索。
        base *= prime[i]; //循环一次要乘一次,不是只有dfs时再乘
        if(n%(num*(j+1)) == 0)
            dfs(i+1, j, base, num*(j+1));
    }
}
dfs(0, 62, 1, 1)  //一个数unsigned long long类型的2最多为62次

相关题:
http://codeforces.com/problemset/problem/27/E
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1562
http://acm.timus.ru/problem.aspx?space=1&num=1748
http://acm.hdu.edu.cn/showproblem.php?pid=4542

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值