首先,说明一个知识点:
设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