lanqiao 1457 杨辉三角形(优化解法)

This commit is contained in:
2025-04-07 15:35:51 +08:00
parent 118a9e171c
commit 224120a35e

View File

@@ -1,11 +1,12 @@
// lanqiao 1457 杨辉三角形(优化解法)
#include<bits/stdc++.h>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main(){
int n; cin >>n;
if(n == 1){
int n; cin >> n;
a[0] = b[0] = 1;
if (n == 1){
cout << 1 << endl;
return 0;
}
@@ -13,7 +14,27 @@ int main(){
如果某一行第二个数是n那么第三个数一定是n(n-1)/2,算到44723行
44723*44723>10亿所以算到前44723行即可
*/
for (int i = 3; i <= 44723; i++){
// 对于本题的规模,使用杨辉三角模版求解会超时,由于杨辉三角是对称的
// 所以我们只需要求解一半即可
for(int j = 1; j <= i/2; j++){
if (j == i/2 && i%2 == 1) b[j] = 2 * a[j - 1];
else b[j] = a[j - 1] + a[j];
a[j - 1] = b[j - 1]; // 更新滚动数组
if (b[j] == n){
// 如果找到了n, 则前i-1行, 按照等差数列计算一共有i*(i-1)/2个元素
// 由于当前行我们是从第二个元素开始算的,所以需要+j+i
cout << i * (i - 1)/2 + j + 1 << endl;
return 0;
}
}
a[i/2] = b[i/2];
}
// 对于超过44723行的情况其实只需要考虑每一行的第二个元素即可第三个元素一定越界
// 而每一行的第二个数字正好就是行号-1假设某一行第二个数字是n则行号i=n+1
// 所以到当前元素的总个数为n*n+1/2
// 总的来说这个表达式计算超过44723行时第一次出现n的位置
cout << n*(n+1)/2 + 2 << endl;
return 0;
}
/* test samples -> 13