题目
给定一个正整数 N,请你输出杨辉三角数列中第一次出现 N 是在第几个数?
输入格式
输入一个整数 N。
输出格式
输出一个整数代表答案。
代码
package blueBridgeCB2021First;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 杨辉三角形
* AC
* https://www.acwing.com/problem/content/3421/
*不能过样例:1,因为N=1,本来想的是开始二分最小是C(k,2k),但是r=N=1,没有经过二分,C(1,1)却=1,因此把3输出了。需要添加条件N>=2*k,
*/
public class T3418 {
static String[] s;
static int N;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
s = in.readLine().split(" ");
N = Integer.valueOf(s[0]);
for (int i = 16; i >=0; i--) {
if(check(i))
break;
}
}
static long C(int a,int b) {
long res = 1;
for (int i = 1,j=b; i<=a; i++,j--) {
res=res*j/i;
if(res>N)
return res;
}
return res;
}
static boolean check(int k) {
long l = 2*k,r=N;
while(l<r) {
long mid = (l+r)>>1;
if(C(k,(int) mid)>=N)
r = mid;
else
l = mid+1;
}
if(C(k,(int) r)!=N||N<2*k)
return false;
else {
System.out.println(r*(r+1)/2+k+1);
return true;
}
}
}