URAL 1748. The Most Complex Number(反素数)

本文介绍了一种求解在给定范围内拥有最多约数的数的算法,并给出了具体的实现代码。采用递归深度优先搜索的方法,利用质数分解来寻找最佳答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

求n以内约数个数最多的数,有多个约数相等的就求最小的那一个。


解题思路:

就是说求反素数,其实可以直接打个表。。



代码:

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const LL inf=1e18+1;

LL ans;
int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};  

LL n;
int now;
void dfs(int dept, int limit, LL tmp, int num)
{
    if(tmp>n)return;
    if(num>now || (num==now && tmp<ans))
    {
        now=num;
        ans=tmp;
    }
    for(int i=1; i<=limit; i++)
    {
        if(n/p[dept]<tmp)break;
        tmp*=p[dept];
        dfs(dept+1, i, tmp, num*(i+1));
    }
    return;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        now=0;
        ans=inf;
        cin>>n;
        dfs(0, 64, 1, 1);
        printf("%lld %d\n", ans, now);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值