当前位置: 首页 > news >正文

洛谷P8749 [蓝桥杯 2021 省 B] 杨辉三角形

40分做法:

思路:暴力
 

直接预处理出来前1000行的杨辉三角形,然后暴力枚举,找到x,输出即可

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 1e3 + 10;

int n = 1000;
int a[N][N];

int main() {
    a[1][1] = 1;
    for (int i = 2; i <= n; i ++) // 预处理
        for (int j = 1; j <= i; j ++)
            a[i][j] = a[i - 1][j] + a[i - 1][j - 1];

    int x; cin >> x;

    int cnt = 0;
    for (int i = 1; i <= n; i ++) // 枚举
        for (int j = 1; j <= i; j ++) {
            cnt ++;
            if (a[i][j] == x) {
                cout << cnt;
                return 0;
            }
        }       
    return 0;
}

50分做法:

思路:推公式

80分做法:

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

typedef long long ll; 

int main() {
    ll n;
    cin >> n;
    cout << n * (n + 1) / 2 + 2;
    return 0;
} 

80分做法:

思路:将上面两种方法相结合

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 1e3 + 10;
typedef long long ll; 

int n = 1000;
int a[N][N];

int main() {
    ll x; cin >> x;
    if (x > 1000 * 999 / 2) {
        cout << x * (x + 1) / 2 + 2;
        return 0;
    }

    a[1][1] = 1;
    for (int i = 2; i <= n; i ++)
        for (int j = 1; j <= i; j ++)
            a[i][j] = a[i - 1][j] + a[i - 1][j - 1];

    ll cnt = 0;
    for (int i = 1; i <= n; i ++) 
        for (int j = 1; j <= i; j ++) {
            cnt ++;
            if (a[i][j] == x) {
                cout << cnt;
                return 0;
            }
        }       
    return 0;
}

满分(100分)做法:

思路:二分

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

typedef long long ll; 

int n; 

ll C(int a, int b) { // 求组合数函数 
    ll res = 1;
    for (int i = a, j = 1; j <= b; i --, j ++) {
        res = res * i / j;
        if (res > n) return res;
    }
    return res;
} 

bool check(int k) {
    ll l = k * 2, r = max(n, l);
    while (l < r) {
        ll mid = l + r >> 1;
        if (C(mid, k) >= n) r = mid;
        else l = mid + 1;
    }
    if (C(r, k) != n) return false;

    cout << r * (r + 1) / 2 + k + 1;

    return true;
}

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

相关文章:

  • 关于无线网络安全的基础知识,涵盖常见威胁、防护措施和实用建议
  • 简单记录一下Android四大组件
  • MySQL部分总结
  • 07.unity 游戏开发-粒子系统
  • 结构化需求分析:功能、数据与行为的全景建模
  • Tauri 2.3.1+Leptos 0.7.8开发桌面应用--Sqlite数据库的写入、展示和选择删除
  • 安卓设备使用网线连接电脑lan口
  • 从存储到智能:AI NAS的技术路径与未来演进
  • Android游戏辅助工具开发详解
  • 使用OpenSceneGraph (osg)实现一个星系漫游
  • asm汇编源代码之-字库转换程序
  • Mybatis-缓存详解
  • 因泰立科技激光雷达:点亮煤矿厂自动装车的智慧之光
  • 音视频学习(三十四):H264中的宏块
  • thymeleaf配套Security6
  • 如何将excel数据快速导入数据库
  • 【时频谱分析】快速谱峭度
  • 每日算法-250413
  • deskflow使用教程:一个可以让两台电脑鼠标键盘截图剪贴板共同使用的开源项目
  • 【开发工具】科研开发中的主流AI工具整理及如何使用GPT润色英文论文
  • 优秀“博主”在上海杨浦购房最高补贴200万元,有何条件?
  • 山东14家城商行中,仅剩枣庄银行年营业收入不足10亿
  • 明星同款撕拉片,为何能炒到三四百一张?
  • 长三角地区中华老字号品牌景气指数发布,哪些牌子是你熟悉的?
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长
  • A股三大股指收涨:军工股掀涨停潮,两市成交近1.5万亿元