题目链接:http://codeforces.com/contest/830/problem/C
公式可以整理成
然后我们可以用类似莫比乌斯的方法枚举d的取值区间
注意到的取值,只有个取值,所以最多有个取值,然后我们暴力枚举这些值,然后验证d是否在我们枚举的区间中,然后更新答案,复杂度为O(20000*sqrt(1e9))
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=105;
typedef long long ll;
int a[MAXN];
ll lim=0;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
ll k;
scanf("%d%lld",&n,&k);
lim=k;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
lim+=a[i];
}
ll last,ans=0;
for(ll d=1;d<=1000000000;d=last+1)
{
ll tot=0;
last=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(a[i]>d)
{
last=min(last,(a[i]-1)/((a[i]-1)/d));
}
}
for(int i=1;i<=n;i++)
{
tot+=(a[i]-1)/d+1;
}
ll tmp=lim/tot;
if(tmp<=last&&tmp>=d)
ans=max(ans,tmp);
}
printf("%lld\n",ans);
return 0;
}