bzoj1053 反素数ant 搜索

首先,说明一个知识点:

    设N=a1^p1*a2^p2*...*an^pn(ai为质数),则N的约束个数为(p1+1)*(p2+1)*...*(pn+1)

    简单证明:利用乘法原理,对于每一个ai^pi,我们有:1,ai,ai^2,...,ai^pi共(pi+1)种方案。因此总的方案数共有(p1+1)*(p2+1)*...*(pn+1)种方案。

    例如12=2^2*2,约数个数为(2+1)*(1+1)=6,分别是1,2,3,4,6,12


第二,证明最多需要不超过11个不同的质因数

    显而易见,较小的质因数明显优于较大的质因数,那么,到第11个质因数为止,总的乘积2*3*5*7*11*13*17*19*23*29*31>MAXN(2*10^9)。因此,我们可以用暴力搜索完成这道题目


    下面回到题目,题意即求小于N的数中约数最多得数(相同约数个数取较小解),我们可以证明最多需要20个质因数,直接枚举每个质因数的个数,取解即可。


下附AC代码:

const
  c:array[1..12] of longint=
  (1,2,3,5,7,11,13,17,19,23,29,31);
var
  n,ans,num:longint;
procedure dfs(k,now,sum,x:longint);
var
  i,t:longint;
begin
  if k>=12 then
    begin
      if sum=num then
        if now<ans then ans:=now;
      if sum>num then
        begin
          num:=sum; ans:=now;
        end;
      exit;
    end;
  t:=1;
  for i:=0 to x do
    begin
      dfs(k+1,now*t,sum*(i+1),i);
      t:=t*c[k];
      if int64(now)*int64(t)>int64(n) then break;
    end;
end;
begin
  readln(n);
  dfs(1,1,1,20);
  writeln(ans);
end.


2015.2.8

by lych

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值