数学问题...
根据题意,有:
移项,整理,得:
记
于是
那么
可以看到,最多只会有2*
个取值(显而易见)
于是对应的,可能产生效果的d也只会有个,于是我们把他们找出来,扔进一个数组里然后排序,去重,获得的就是所有可能的取值
接下来,我们枚举所有取值,然后计算出左边的表达式,那么显然,我们是可以求出最大的d的,那么我们只需要求最大的这个d比枚举到的取值要大即可(否则显然是不合法的啊)!
这样问题就解决了
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
ll a[105];
ll n,k;
ll fac[10000005];
int main()
{
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
scanf("%I64d%I64d",&n,&k);
ll c=k;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
c+=a[i];
}
int cnt=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j*j<=a[i];j++)
{
fac[++cnt]=j;
fac[++cnt]=(a[i]-1)/j+1;
}
}
sort(fac,fac+cnt+1);
cnt=unique(fac,fac+cnt+1)-(fac+1);
ll ans=1;
for(int i=1;i<=cnt;i++)
{
ll temp=0;
for(int j=1;j<=n;j++)
{
temp+=(a[j]-1)/fac[i]+1;
}
ll t=c/temp;
if(t>=fac[i])
{
ans=t;
}
}
printf("%I64d\n",ans);
return 0;
}