规律:
代码:
#include<iostream>
using namespace std;
typedef long long ll;
int n;
ll C(int a,int b){
ll res=1;
for(int i=a,j=1;j<=b;j++,i--){
res=(ll)res*i/j;
}
return res;
}
bool check(int k){
int l=2*k,r=max(l,n); //max!!
while(l<r){
int mid=(l+r)/2; //二分找最早出现的n即找左边界的值
if(C(mid,k)>=n)
r=mid;
else
l=mid+1;
}
if(C(r,k)!=n)
return false;
cout<<(ll)r*(r+1)/2+k+1<<endl;
return true;
}
int main(){
cin>>n;
for(int k=20;k>=0;k--){ //从最后一个斜行开始寻找,因为每一个斜行都是单调递增的,n最早出现在后边的斜行
//其实n一定在前16个斜行,因为C16,32 >=1e9,k>=16可以但是不能小于16,因为C15,30 < 1e9
if(check(k))
break;
}
return 0;
}