codeforces 27 E. Number With The Given Amount Of Divisors(反素数)

96 篇文章 0 订阅
64 篇文章 0 订阅

题意:

求最小的约数个数为n的数


解题思路:

反素数经典问题。这题要求的就是反素数,因为反素数的质因子一定是连续的,所以可以dfs枚举在连续几个质因子上的个数,即枚举种t1,t2,t3,每一个素因子的幂,来算出当前的数的因子个数,对于等于n的我们更新一下答案,使答案更小即可。


更形象一点的还是看acdreamers的博客吧,看到搜索树的图就很好理解了。


代码:

#include <bits/stdc++.h>
using namespace std;
const unsigned long long inf=~0ULL;
int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};  

int n;
unsigned long long  ans;

void dfs(int dept, unsigned long long tmp, int num)
{
    if(num>n)return;
    if(num==n){ans=min(tmp, ans);return;}
    for(int i=0; i<=63; i++)
    {
        if(inf/p[dept]<tmp)break;
        dfs(dept+1, tmp*=p[dept], num*(i+2));
    }
    return;
}
int main()
{
    cin>>n;
    ans=inf;
    dfs(0, 1, 1);
    cout<<ans<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值