难度:中等 |
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s |
来源:第十二届蓝桥杯省赛第一场C++B/C组,第十二届蓝桥杯省赛第一场JAVAB/C/研究生组 |
下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:
1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ...
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?
输入格式
输入一个整数 N。
输出格式
输出一个整数代表答案。
数据范围
对于 20% 的评测用例,1≤N≤10;
对于所有评测用例,1≤N≤1000000000;
输入样例:
6
输出样例:
13
本人代码只过40%
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 1e4; int a[N][N]; int main() { int n; int res=0; cin>>n; a[0][0]=1; for(int i=1;i<=2*n;i++) { for(int j=1;j<=i;j++){ a[i][j]=a[i-1][j-1]+a[i-1][j]; res++; if(a[i][j]==n){ cout<<res; return 0; } } } }
看大佬的高级完全通过版
#include<iostream> #include<algorithm> #include<cstring> 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; i --, j ++) { res = res * i / j; if (res > n) return res; } return res; } bool check(int k) { ll l = k * 2, r = max(n, l); while (l < r) { ll mid = l + r >> 1; if (C(mid, k) >= n) r = mid; else l = mid + 1; } if (C(r, k) != n) return false; cout << r * (r + 1) / 2 + k + 1; return true; } int main() { cin >> n; for (int k = 16; ; k --) if (check(k)) break; return 0; } 作者:L-China 链接:https://www.acwing.com/solution/content/167373/