蓝桥杯 杨辉三角形 C语言

题目描述

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

如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯

给定一个正整数 �N,请你输出数列中第一次出现 �N 是在第几个数?

输入描述

输入一个整数 �N。

输出描述

输出一个整数代表答案。

输入输出样例

示例 1

输入

6

输出

13

评测用例规模与约定

对于 2020​​ 的评测用例,1≤�≤101≤N≤10​; 对于所有评测用例,1≤�≤10000000001≤N≤1000000000。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

解题思路

        1(我没敢用)先弄个程序 把可能用范围的表打出来 对输入的N直接找

        2 根据斜行枚举 在每个斜行内用二分法查找 每个数一定在16斜行和其之前

                如果能找到 printf位置后退出

                如果没找到 斜行-1 继续二分找

                【蓝桥杯经典数学题】杨辉三角形_蓝桥杯杨辉三角_涅槃豆的博客-CSDN博客

                可以根据上述链接里的杨辉三角用组合数表示的图 来理解这个题

代码

#include <stdio.h>
#define LL long long
#define MAX(A, B) (((A) > (B))? (A): (B))

LL N;

LL C(LL n, LL k);

int main(int argc, char* argv[]) {
    LL k, i, left, right, mid;
    scanf("%lld", &N);
    for (k = 16; k >= 0; k--) {
        left = 2 * k;
        right = MAX(N, left);
        while (left <= right) {
            mid = (left + right) / 2;
            i = C(mid, k);
            if (i >= N) right = mid - 1;
            else left = mid + 1;
        }
        if(C(left, k) == N) {
            printf("%lld\n", left * (left + 1) / 2 + k + 1);
            return 0;
        }
    }
    return 0;
}

LL C(LL n, LL k) {
    LL ans = 1, j = 1;
    for (; j <= k; n--, j++) {
        ans = ans * n / j;
        if (ans > N) break;
    }
    return ans;
}
    

                

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值