牛客周赛 Round 59(上)

TD

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include<iomanip>
#include<algorithm>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    cout << fixed << setprecision(12) << static_cast<double>(n) / m << endl;
    return 0;
}

代码思路

  • fixed 和 setprecision(12) 结合使用,设置输出的浮点数格式为固定小数点位数的形式,这里设置为保留 12 位小数。
  • static_cast<double>(n) 将整数 n 强制转换为双精度浮点数,然后除以 m,得到一个浮点数结果。

你好,这里是牛客竞赛

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <stdio.h>
#include <string.h>

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        char s[101];
        scanf("%s", s);
        if ((strncmp(s, "https://www.nowcoder.com", 24) == 0 || strncmp(s, "www.nowcoder.com ", 16) == 0)) {
            puts("Nowcoder");
        } else if ((strncmp(s, "https://ac.nowcoder.com", 23) == 0 || strncmp(s, "ac.nowcoder.com ", 15) == 0)) {
            puts("Ac");
        } else {
            puts("No");
        }
    }
    return 0;
}

代码思路

  • 使用 strncmp 函数进行字符串比较判断:
    • strncmp(s,"https://www.nowcoder.com",24)==0 || strncmp(s,"www.nowcoder.com ",16)==0:判断输入的字符串 s 是否以 "https://www.nowcoder.com" 开头(比较前 24 个字符)或者以 "www.nowcoder.com " 开头(比较前 16 个字符)。如果满足其中一个条件,说明这个字符串与特定的 “Nowcoder” 相关的网址格式匹配。
    • strncmp(s,"https://ac.nowcoder.com",23)==0 || strncmp(s,"ac.nowcoder.com ",15)==0:类似地,判断输入的字符串 s 是否以 "https://ac.nowcoder.com" 开头(比较前 23 个字符)或者以 "ac.nowcoder.com " 开头(比较前 15 个字符)。如果满足其中一个条件,说明这个字符串与特定的 “Ac” 相关的网址格式匹配。
  • 如果上述条件都不满足,则输出 "No",表示输入的字符串不符合特定的网址格式。
  • strncmp 函数用于比较两个字符串的前 n 个字符。如果两个字符串的前 n 个字符相同,则返回 0;如果第一个字符串小于第二个字符串,则返回一个负数;如果第一个字符串大于第二个字符串,则返回一个正数。
  • 通过这种方式,可以快速判断输入的字符串是否符合特定的网址格式,从而输出相应的结果。整个程序的目的是根据输入的字符串是否与特定的网址格式匹配,输出对应的标识。

小红的数组回文值

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int long long
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;
int fact[N], infact[N];
int qp(int a, int n) {
    int res = 1;
    while (n) {
        if (n & 1)
            res = res * a % MOD;
        n >>= 1, a = a * a % MOD;
    }
    return res;
}
int inv(int x) { return qp(x, MOD - 2); }
int comb(int a, int b) {
    if (a < 0 || b < 0 || a < b)
        return 0;
    return fact[a] * infact[b] % MOD * infact[a - b] % MOD;
}
int __comb(int a, int b) {
    if (a < 0 || b < 0 || a < b)
        return 0;
    int res = infact[b];
    for (int i = 0; i < b; i++)
        res = res * (a - i) % MOD;
    return res;
}
int norm(int x) { return (x % MOD + MOD) % MOD; }
void Prework(int n = N - 10) {
    fact[0] = 1;
    for (int i = 1; i <= n; i++) {
        fact[i] = fact[i - 1] * i % MOD;
    }
    infact[n] = qp(fact[n], MOD - 2);
    for (int i = n; i >= 1; i--) {
        infact[i - 1] = infact[i] * i % MOD;
    }
}
void Solve() {
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    vector dp(n + 1, vector<int>(n + 1));
    vector<int> p(n + 1, 1);
    for (int i = 1; i <= n; i++)
        p[i] = p[i - 1] * 2 % MOD;
    int res = 0;
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j + i - 1 <= n; j++) {
            int l = j, r = j + i - 1;
            int x = l - 1, y = n - r;
            if (a[l] != a[r]) {
                res = (res + p[r - l - 1] * comb(x + y, x) % MOD) % MOD;
            }
        }
    }

    cout << res << endl;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    Prework();
    while (T--)
        Solve();
}

代码思路

一、整体思路

  1. 预计算阶乘和逆阶乘:通过Prework函数预先计算出从 0 到N - 10(默认值,可根据需要调整)的阶乘和逆阶乘,以便后续快速计算组合数。
  2. 输入与处理:读入整数n,表示序列的长度。读入一个长度为n + 1的序列a。定义一个二维向量dp和一个长度为n + 1的向量p,并初始化p的每个元素为 1,后续用于计算 2 的幂次方。
  3. 双重循环计算结果:外层循环遍历区间长度i从 2 到n。内层循环遍历起始位置j,使得j + i - 1 <= n,确定一个区间。对于每个区间,计算区间左右端点lr,以及对应的x = l - 1y = n - r。如果区间左右端点对应的值a[l]a[r]不相等,则计算组合数comb(x + y, x),并与p[r - l - 1]相乘后累加到结果res中,同时对结果取模防止溢出。
  4. 输出结果:最终输出计算得到的结果res

二、主要函数原理

  1. qp函数(快速幂):采用二进制快速幂算法计算an次幂。通过不断将指数n二进制拆分,在每次拆分过程中,如果当前位为 1,则将结果累乘当前的底数a,底数a则通过自乘不断更新。这样可以在对数时间内计算出幂次结果。
  2. inv函数(求逆元):利用费马小定理,即当MOD为质数时,a的逆元为a^(MOD - 2)。调用qp函数计算x在模MOD下的逆元。
  3. comb函数(计算组合数):根据组合数的定义,组合数C(a, b)等于a! / (b! * (a - b)!)。这里通过预先计算好的阶乘和逆阶乘来快速计算组合数。先判断传入的参数是否合法,如果不合法则返回 0。否则,利用预计算的结果计算组合数,即fact[a] * infact[b] % MOD * infact[a - b] % MOD
  4. __comb函数(另一种计算组合数的方式):同样是计算组合数,这里采用了另一种方法。先计算infact[b],然后通过循环不断乘以(a - i),最后得到组合数结果。
  5. norm函数(规范化结果):确保结果在模MOD下为非负数。如果结果小于 0,则加上MOD使其变为非负数,然后再对MOD取模。
  6. Prework函数(预计算阶乘和逆阶乘):首先初始化fact[0]为 1。然后通过循环计算从 1 到n的阶乘,即fact[i] = fact[i - 1] * i % MOD。接着从后往前计算逆阶乘,先计算infact[n]fact[n]的逆元,然后通过循环计算infact[i - 1]infact[i] * i % MOD
  7. Solve函数(解决问题):读入数据后,通过双重循环遍历不同的区间。对于每个区间,如果左右端点的值不相等,则计算组合数和 2 的幂次方,累加到结果中。最后输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

筱姌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值