首页 > 其他分享 >杨辉三角形

杨辉三角形

时间:2023-03-19 10:12:56浏览次数:52  
标签:return int 位置 ans 杨辉三角 斜行

给定一个正整数 N,请你输出数在杨辉三角 中第一次出现N 是在第几个数?

思路

参考

杨辉三角特点:

image

  1. 对称性
    杨辉三角形左右两边数字对称相等。

  2. 渐增性
    越往中间数字越大,除最外层1外,越往下数字越大。

  3. 组合数
    杨辉三角形里面的每一个元素都能用组合数表示。第\(N\)行的第\(M\)列可以表示成\(C(N-1,M-1)\),如6在第5行的第3列,它对应的组合数就是\(C(5-1,3-1)\),即\(C(4,2)\)。

解题思路

  • 因为要找出第一次N出现的位置,根据对称性可知,N出现的位置必定在左边,因此只考虑左半边位置即可。
  • 由于每个斜方向的数都是逐增的,因此考虑在斜方向二分;并且根据组合数性可知,可以通过位置计算出该位置的值,因此可以在每个斜方向二分位置,二分过程是通过将该位置的数和\(N\)比较。

然后问题就是:

  1. 如何找到每个斜行?
    for循环遍历是第几层斜行即可。因为在内斜行中元素总是较先出现的,所以我们要从内斜行开始从内往外开始找,

  2. 如何确定每个斜行的初始位置和终止位置?
    可以发现中心对称轴的元素是每一斜行中最小的,它的特点是 \(C( k, 2k )\) 。
    以目标值作为终止位置即可。
    image

  3. 找多少斜行?
    如果该斜行最小元素都已经超出10的9次方那么剩下的元素都是大于10的9次方的,也就是说这一斜行是没有意义的,不用考虑。经计算,只有16斜行以内的数才符合条件。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long 
int n;
//前大后小
int C(int x,int k){
    int ans=1;
    for(int i=x,j=1;j<=k;i--,j++){
        ans=ans*i/j;
        if(ans>n)return ans;
    }
    return ans;
}

int solve(int x){
    int l=2*x , r=max(n,l);
    while(l<r){
        int mid=l+(r-l)/2;
        int val=C(mid,x);
        if(val>=n) r=mid;
        else  l=mid+1;
    }
    if(C(r,x)!=n) return 0;
        cout<<(r * (r + 1) / 2) + x + 1<<endl;
    return 1;
}
signed main()
{
    cin>>n;
    for(int i=17;i>=0;i--)
        if(solve(i)) break;
    return 0;
}

标签:return,int,位置,ans,杨辉三角,斜行
From: https://www.cnblogs.com/kingwz/p/17232527.html

相关文章

  • 杨辉三角形
    #include<stdio.h>voidmain(){/*创建时间:2012、9、1;描述:输出杨辉三角11112113311464115......
  • 基本功练习_2_24_2之杨辉三角
    #include<stdio.h>intmain(void){intl;printf("输入行数\n");scanf("%d",&l);intf[100][100]={0};inta,b,c,d,e;for(a=0;a<100;a++){f[a][0]......
  • 杨辉三角
    题目描述:   思路:杨辉三角的特点就是,每行的第一个元素和最后一个元素都是1;其他元素=上一行与当前元素对应位置的元素+ 上一行与当前元素对应位置的元素的前一......
  • 算法刷题-杨辉三角-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • 杨辉三角形和数组练习
    1.杨辉三角形1.1使用二维数组打印一个10行杨辉三角publicclassTest22{publicstaticvoidmain(String[]args){intyanghui[][]=newint[10][];for(int......
  • 杨辉三角 II
    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例1:输入:numRows=5输出:[[1],[1,1],[1......
  • 杨辉三角
    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例1:输入:numRows=5输出:[[1],[1,1],[1......
  • 杨辉三角
    1#include<stdio.h>2#defineN6//宏3intmain(intargc,constchar*argv[])4{5inta[N][N];6inti,j;7for(i=0;i<N;i++)//外循环,第......
  • 算法刷题-插入区间、杨辉三角、移除链表元素
    插入区间给你一个无重叠的,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例1:输入......
  • 杨辉三角(力扣简单题,resize())函数
    题目:给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例1:输入:numRows=5输出:[[1],[1,1],[......