1. 程式人生 > >Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) C. Bamboo Partition(數學)

Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) C. Bamboo Partition(數學)

公式可以整理成


然後我們可以用類似莫比烏斯的方法列舉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;
}