题目描述
下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下
数列:1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ...
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?
输入
输入一个整数 N。
输出
输出一个整数代表答案。
样例输入
6
样例输出
13
提示
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ N ≤ 10;
对于所有评测用例,1 ≤ N ≤ 1000000000。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] arr = new int[40][10005];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || i == j) {
arr[i][j] = 1;
} else {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
}
int N = sc.nextInt();
int count = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j <= i; j++) {
if (N == arr[i][j]) {
System.out.println(count);
return;
} else {
count++;
}
}
}
}
}
public class 杨辉三角形 {
public static void main(String[] args) {
new 杨辉三角形().run();
}
int N;
void run() {
N = new Scanner(System.in).nextInt();
if (N == 1)
System.out.println(1);
else {
long ans = (N + 1L) * N / 2 + 2;
for (int m = 2; m < 16; m++) {
int start = m * 2, end = N;
while (start <= end) {
int mid = start + end >> 1;
if (C(mid, m) == N) {
ans = min(ans, (mid + 1L) * mid / 2 + m + 1);
break;
}
if (C(mid, m) > N)
end = mid - 1;
else
start = mid + 1;
}
}
System.out.println(ans);
}
}
long min(long a, long b) {
return a < b ? a : b;
}
long C(int n, int m) {
long num = 1;
for (int nm = 1; nm <= m; n--, nm++)
if ((num = num * n / nm) > N)
return num;
return num;
}
}