x为任意数 要求min
∑
a
i
/
x
+
a
i
%
x
\sum ai/x+ai\%x
∑ai/x+ai%x
发现
a
i
%
x
=
a
i
−
⌊
a
i
/
x
⌋
∗
x
ai\%x=ai-\lfloor ai/x \rfloor *x
ai%x=ai−⌊ai/x⌋∗x
所以有
∑
a
i
/
x
+
a
i
%
x
=
∑
a
i
−
⌊
a
i
/
x
⌋
∗
x
+
⌊
a
i
/
x
⌋
=
∑
a
i
−
⌊
a
i
/
x
⌋
∗
(
x
−
1
)
\sum ai/x+ai\%x=\sum{ai-\lfloor ai/x \rfloor *x+\lfloor ai/x \rfloor=\sum{ai-\lfloor ai/x \rfloor*(x-1)}}
∑ai/x+ai%x=∑ai−⌊ai/x⌋∗x+⌊ai/x⌋=∑ai−⌊ai/x⌋∗(x−1)
要使
∑
a
i
−
⌊
a
i
/
x
⌋
∗
(
x
−
1
)
\sum{ai-\lfloor ai/x \rfloor*(x-1)}
∑ai−⌊ai/x⌋∗(x−1)最小,就要使
s
u
m
⌊
a
i
/
x
⌋
∗
(
x
−
1
)
sum{\lfloor ai/x \rfloor*(x-1)}
sum⌊ai/x⌋∗(x−1)最大
所以我们枚举x,用整除分块计算前面的
s
u
m
⌊
a
i
/
x
⌋
sum{\lfloor ai/x \rfloor}
sum⌊ai/x⌋,取最小值就行了
复杂度需要用调和级数证明(
∑
i
=
1
i
=
n
1
i
=
l
o
g
n
\sum_{i=1}^{i=n}{\frac{1}{i}}=logn
∑i=1i=ni1=logn)
#include<bits/stdc++.h>
#define ri register
#define ll long long
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
const int N=1e6+5;
int n,a[N],maxn=0;
ll ans=0,sum=0;
inline void file(){freopen("sale.in","r",stdin);freopen("sale.out","w",stdout);}
int main(){file();
n=read();
for(ri int i=1;i<=n;i++) a[i]=read(),sum+=a[i],maxn=max(maxn,a[i]);
sort(a+1,a+n+1);
for(ri int i=1;i<=maxn;i++){
int l=1,r=n,mid,la=0;
ll res=0;
for(ri int j=i;j<=maxn;j+=i){
l=1,r=n;
while(l<r){
mid=(l+r+1)>>1;
if(a[mid]<j) l=mid;
else r=mid-1;
}
res+=((ll)l-la)*(a[l]/i),la=l;
}
res+=((ll)n-la)*(a[l+1]/i);
ans=max(ans,(ll)res*(i-1));
}
cout<<sum-ans<<endl;
return 0;
}