CodeForces 830C Bamboo Partition
要求最大的d满足
∑ni=1d−((ai−1)%d+1)≤k
推出上下界
n×d−∑ni=1ai−⌊ai−1d⌋×d≤k
n×d+d∑ni=1⌊ai−1d⌋≤k+∑ni=1ai
枚举 ⌊ai−1d⌋ 的取值,乱搞就行了
#include <cstdio>
#include <vector>
#include <algorithm>
#define C (c=getchar())
#define ll long long
using namespace std;
inline void read(int& a)
{
a=0;int f=1;static char c;C;
while (c<'0'||c>'9') {if (c=='-') f=-1;C;}
while (c>='0'&&c<='9') a=(a<<3)+(a<<1)+c-48,C;a*=f;
}
inline void read(ll& a)
{
a=0;int f=1;static char c;C;
while (c<'0'||c>'9') {if (c=='-') f=-1;C;}
while (c>='0'&&c<='9') a=(a<<3)+(a<<1)+c-48,C;a*=f;
}
int n,a[105];
ll k,tot;
vector<int> q;
int main()
{
register int i,j;
read(n),read(k);
for (i=1;i<=n;i++) read(a[i]),tot+=a[i]--;tot+=k;int d;
for (i=1;i<=n;i++)
for (j=1;j<=a[i];j=d+1)
d=a[i]/(a[i]/j),q.push_back(j);
for(i=1;i<=n;i++) q.push_back(a[i]+1);
sort(q.begin(),q.end());q.resize(unique(q.begin(),q.end())-q.begin());
int ans;
for (j=q.size()-1;j;j--)
{
d=q[j];ll tmp=0;
for (i=1;i<=n;i++)tmp+=d*(a[i]/d);
if (1ll*n*d+tmp<=tot) {ans=d;break;}
}
ll tmp=0;
for (i=1;i<=n;i++) tmp+=(a[i]/ans);
printf("%lld\n",tot/(n+tmp));
}