Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
题目描述
下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ⋯
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?
输入描述
输入一个整数 N。
输出描述
输出一个整数代表答案。
输入输出样例
示例 1
输入
6
输出
13
我的思路
杨辉三角,熟悉的人都知道,非常具有规律性,我们需要找出其中的规律来求解。我们看到杨辉三角形都会想到一个数的值等于它上面两个数的和。为此,暴力求解,可以不断通过前一行的数求出后一行的数,重复上面操作,直到找到目标为止。但是这样暴力求解,可能会出现超时或者超出内存限制。杨辉三角对称,因此我们只要算一半的数即可,用两个数组维护上一状态和这一状态的数,然后在快速判断这个数第一次是否只出现在n行的第二个数即可
#include <bits/stdc++.h>
using namespace std;
long long a[100010],b[100010];
int main()
{
a[0]=1;
b[0]=1;
long long n;
cin>>n;
if(n==1){
cout<<1;
return 0;
}
for(int i=3;i<=44723;i++){
int m=i/2;
for(int j=1;j<=m;j++){
if(j==m&&i%2==1){
b[j]=a[j-1]*2;
}
else{
b[j]=a[j-1]+a[j];
}
a[j-1]=b[j-1];
if(b[j]==n){
cout<<i*(i-1)/2+j+1;
return 0;
}
}
a[m]=b[m];
if(b[1]>n){
cout<<n*(n+1)/2+2;
return 0;
}
}
cout<<n*(n+1)/2+2;
return 0;
}