蓝桥杯2021-杨辉三角形

640 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目描述

下面的图形是著名的杨辉三角形:

image

如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 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;
}

总结