点击跳转例题
思路:第0层 1
第1层 1 1
第2层 1 2 1
第3层 1 3 3 1
第4层 1 4 6 4 1
第5层 1 5 10 10 5 1
每一层对应元素为
C(n,0) C(n,1).....C(n,n-1) C(n,n);
最开始观察到,由于每一行的一半元素是递增的,所以我们可以枚举行,然后二分每一列,但是枚举的每一行的时间复杂度太长,所以错误的。
但是我们可以切换思路。枚举每一列,二分每一行,就降低了复杂度(每一列的元素也是递增的)。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' using namespace std; const int N=2e5+10,M=1e3+10; int C(int a,int b,int n) { if(b>a)return 0; if(b*2>a)b=a-b; int ans=1; for(int i=0;i<b;i++) { ans=ans*(a-i)/(i+1); if(ans>=n)return ans; } return ans; } signed main() { std::ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int n;cin>>n; if(n==1) { cout<<1<<endl; return 0; } int x=1e9,y=1e9; for(int i=0;i<=20;i++) { int l=2,r=1e9; while(l<r) { int mid=(l+r)/2; if(C(mid,i,n)>=n) r=mid; else l=mid+1; } if(C(l,i,n)==n) { if(l<x) { x=l; y=i; } } } cout<<x*(x+1)/2+y+1<<endl; return 0; }
P8749 [蓝桥杯 2021 省 B] 杨辉三角形--2024蓝桥杯冲刺省一
于 2024-02-28 10:39:44 首次发布