题目描述
在解决了马语翻译问题后,马匹数量越来越多,不少乡镇都有了数量可观的马匹,开始出现马球比赛。乡镇之间决定进行马球联赛。联赛的赛制,主要是比赛双方的马匹数量,成了一个急需解决的问题。首先,所有乡镇都要求,本乡镇所有的马匹都必须参赛,或者都不参赛(若组队的马匹数量不是该镇马匹数量的约数,将无法参赛)。其次,在本乡镇,选出最佳球队,参加乡镇间联赛。现在,比赛组织方希望满足所有参赛乡镇的要求,并且使得决赛的马匹尽可能多,请你设计每个球队马匹的数量,使得决赛马匹数最大。注意,决赛至少有 2 个队伍晋级。
输入
第一行一个整数 N,表示想要报名参赛的乡镇。
接下来 N 个用空格分开的整数 a(i),表示第 i 个乡镇报名参赛的马匹数。
输出
计算出决赛最大参与的马匹数。
样例输入
输入样例 1
3 1 3 6
输入样例 2
5 4 6 3 8 9
样例输出
输出样例 1
6
样例解释
每个队伍 3 匹马,乡镇 1 无法参赛。乡镇 2 和 3 都可以进行比赛,决赛 2 个队伍,共 6匹马。
输出样例 2
9
样例解释
每个队伍 3 匹马,乡镇 2,3,5 可以参赛。决赛 3 个队伍, 9 匹马。
数据范围限制
20%的数据 2<=N<=100, 1<=a(i)<=10000。
50%的数据 2<=N<=20000。
100%的数据 2<=N<=200000, 1<=a(i)<= 2000000。
思路:
卡常+伪DP
代码:
var
f,p:array[0..2000001]of int64;
n,i,j,k,x,y,z,ls:longint;
s:int64;
begin
assign(input,'polo.in');
reset(input);
assign(output,'polo.out');
rewrite(output);
read(n);
for i:=1 to n do
begin
read(x);
inc(f[x]);
if x>z then z:=x;
end;
s:=n;
for i:=2 to z do
if f[i]>0 then
begin
for j:=2 to trunc(sqrt(i)) do
begin
if p[j]>=2 then continue;
inc(p[j]);
if i mod j=0 then
begin
inc(f[j],f[i]);
if j*j<>i then inc(f[i div j],f[i]);
end;
end;
end;
for i:=1 to z do
if (f[i]>1)and(f[i]*i>s) then s:=f[i]*i;
writeln(s);
end.