Educational Codeforces Round 26 F. Prefix Sums 二分,组合数
题目链接:http://codeforces.com/contest/837/problem/F
题意:如题QAQ
解法:参考题解博客:http://www.cnblogs.com/FxxL/p/7282909.html
由于新生成的m+1个数列第一个肯定为0,所以可以忽略掉,当作每次新生成的数列只拥有m个元素
来枚举一个例子,可以发现规律。
当a[] = {1,0,0,0,0}时,手动推出的矩阵如下:
可以发现对于这个矩阵显然是满足杨辉三角的,我们二分出一个值后可以直接利用组合数来计算出当前的答案,然后check
#include <bits/stdc++.h> using namespace std; const int maxn = 200010; typedef long long LL; LL n,k,a[maxn]; bool check(LL mid){ double sum=0; LL x,y,p,q; for(LL t=0; t<n; t++){ if(a[t]==0) continue; x=mid; y=(n-1)-t; p=x-1; q=p+y; p = min(q-p, p); double tmp = a[t]; for(LL i=q, j=p; j>=1; j--,i--){ tmp = tmp*i/j; if(tmp>=k) return true; } sum += tmp; if(sum>=k) return true; } return false; } int main() { cin>>n>>k; for(int i=0; i<n; i++){ cin>>a[i]; if(a[i]>=k){ printf("0\n"); return 0; } } LL l=0,r=k,ans; while(l<=r){ LL mid=(l+r)/2; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } bool ok = check(2); if(ans==0) ans++; cout<<ans<<endl; return 0; }