P3020 [JZOJ]最多的约数

给定一个正整数 \(n\),对于所有不超过 \(n\) 的正整数,找到包含约数最多的一个数。如果有多个这样的数,那么回答最小的那个。

有几个定理。\(G(N)\) 为约数个数,\(pri_i\) 为一些质数。

\[G(N)=\prod k_i+1\]

\[\texttt{满足:} \prod pri_i^{k_i}=N\]

也就是说 \(N\) 的约数个数可以由一系列的质数点指数乘积。然后暴搜索即可。

// T3

Const
    total=100000;
    border=64;

var
    judge,number:array[-1..total] of longint;
    ans:array[1..2] of int64;
    i:longint;
    n:int64;

procedure work;
var i,j:longint; tail:longint;
begin
    tail:=0; judge[1]:=1;
    for i:=2 to total do
    begin
        if judge[i]=0 then begin inc(tail); number[tail]:=i; end;
        for j:=1 to tail do
        begin
            if i*number[j]>total then break;
            judge[i*number[j]]:=1;
            if i mod number[j]=0 then break;
        end;
    end;
end;

procedure Dfs(x,exponet:longint;sum:int64); // 第几个质数,指数上界,这个质数的指数,到现在的总值
var
    i:longint;
    tmp:int64;
begin
    if (exponet>ans[2])or((exponet=ans[2])and(sum<ans[1])) then begin ans[1]:=sum; ans[2]:=exponet end;
    tmp:=1; 
    for i:=1 to border do
    begin
        tmp:=tmp*number[x];
        if (tmp>n)or(sum*tmp>n) then break;
        Dfs(x+1,exponet*(i+1),sum*tmp);
    end;
end;

begin
    read(n); Work; ans[1]:=maxlongint;
    Dfs(1,1,1); writeln(ans[1]);
end.

转载于:https://www.cnblogs.com/FibonacciHeap/articles/10584080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值