对式子进行化简后可得
对左边的式子整体进行因式分解,可以发现d和另一个元素的值最多有一个>=sqrt(k+sigma(a_i))(可由反证法证得)
考虑到可以枚举i,范围为1--sqrt(k+sigma(a_i)),每次将d设为i和(k+sigma(a_i))/i,就可以将所有可能性全部遍历。
#include<cstdio> #include<iostream> #include<cmath> #define ll long long using namespace std; ll a[200],n,maxValue; bool isOk(ll d){ ll tmpSum=0; for(ll i=1;i<=n;i++){ tmpSum+=(a[i]-1)/d; } tmpSum+=n; return maxValue>=(d*tmpSum); } int main(){ ll k; scanf("%lld%lld",&n,&k); maxValue=k; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); maxValue+=a[i]; } ll ans=0; for(ll i=1;i*i<=maxValue;i++){ if(isOk(i))ans=max(ans,i); if(isOk(maxValue/i))ans=max(ans,maxValue/i); } printf("%lld\n",ans); return 0; }