Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) C. Bamboo Partition(數學)
阿新 • • 發佈:2019-01-27
公式可以整理成
然後我們可以用類似莫比烏斯的方法列舉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; }