3418. 杨辉三角形

目录

题目描述:

解题思路:

备注知识点:

代码详解:


题目描述:

解题思路:

所求为第一次出现的数字

因为杨辉三角沿中间轴对称

故只需考虑最左边的数字

因为杨辉三角对于每一列从小到大递增

对于每一行从小到大递增(对齐之后看)

故只需从最右边的最上面的数字查看

这样第一个找到的数一定是最先出现的数

备注知识点:

1.对于杨辉三角按对称轴只取最左边,对齐之后,从0开始,每一个数都可以表示为组合数C(x,y)的值(表示第x+1行,第y+1列的数)

2.可以推算出组合数的式子即 $C_{n}^{m}$ = $C_{n-1}^{m}$ + $C_{n-1}^{m-1}$ ,杨辉三角的性质(一个数由上面的数和上面的左边的数相加所得)

代码详解:

#include<iostream>
using namespace std;
typedef long long ll;

ll n;

ll C(ll x,ll y){//求组合数
    if(x==y||y==0) return 1;
    ll ans=1;
    y=min(x-y,y);//取最小的y
    for(ll i=1;i<=y;i++){
        ans=ans*(x-i+1)/i;
        if(ans>n) return ans;//对于大于n的数直接跳过
    }
    return ans;
}

bool check(ll k){
    ll l=2*k;
    ll r=max(l,n);//防止出现r<l的情况
    
    while(l<r){
        ll mid=l+r>>1;
        if(C(mid,k)<n) l=mid+1;
        else r=mid;
    }
    
    if(C(l,k)!=n) return 0;//判断是否相等
    else {
        cout<<(l+1)*l/2+k+1;
        return 1;
    }
}


int main(){
    cin>>n;
    
    for(ll i=16;i>=0;i--){
        if(check(i)) break;
    }
    
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CTGU-Yoghurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值