金山笔试 wps笔试 0918

笔试时间:2024年09月18日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目

小强是一个的农场主,农场里有n头牛,每头牛有着独一无二的体重,每一头牛的颜色可能是m种颜色其中的一种,小强带了一些牛(可能为0个)出来吃草。你需要回答出小强带出来的牛的组合—共有多少种可能?注意:因为每—头牛有自己的体重(没有两头牛体重相等),所以如果四头牛体重分别是1,2,3,4,颜色分別是y1,y1,y4,y4和另外一种方案:四头牛体重分别是1,2,3,4,颜色分别是y1,y4,y4,y1即使两个方案的颜色的种类对应的数量是相同的,但是因为颜色对应的体重不同所以是两个不同的方案。由于方案数可能很大,请对 1e9 + 7 取模。

输入描述

两个正整数n和m。

1 <= n <= 10^9, 1 <= m <= 10^9

输出描述

一个整数代表答案。

样例输入

3 2

样例输出

27

说明:

小强可能带0头牛出来,只有1种方案。

小强可能带1头牛出来,有3*2种方案(带出的是3头牛中的任意一个,这头牛的颜色可能为2种颜色之一)。

小强可能带2头牛出来,有3*2^2种方案。

小强可能带3头牛出来,有1*2^3种方案。

一共有1+6+12+8=27种方案。

参考题解

模拟计算,((1 + m)^n \mod (10^9 + 7))

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>

using namespace std;

const long long MOD = 1000000007;

int main() {
    long long n, m;
    cin >> n >> m;

    long long result = 1;
    long long base = (m + 1) % MOD;

    // 计算 (1 + m)^n % MOD
    while (n > 0) {
        if (n & 1) {
            result = (result * base) % MOD; // 乘以基数
        }
        base = (base * base) % MOD; // 基数平方
        n >>= 1; // n 右移一位
    }

    cout << result << endl;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class CowCombinations {
    private static final long MOD = 1000000007L;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long n = scanner.nextLong(); 
        long m = scanner.nextLong(); 
        scanner.close();

        long result = 1;
        long base = (m + 1) % MOD;

        // 计算 (1 + m)^n % MOD
        while (n > 0) {
            if ((n & 1) == 1) {
                result = (result * base) % MOD; // 乘以基数
            }
            base = (base * base) % MOD; // 基数平方
            n >>= 1; // n 右移一位
        }

        System.out.println(result);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

MOD = 1000000007

def main():
    n = int(input())  # 读取n
    m = int(input())  # 读取m

    result = 1
    base = (m + 1) % MOD

    # 计算 (1 + m)^n % MOD
    while n > 0:
        if n & 1:
            result = (result * base) % MOD  # 乘以基数
        base = (base * base) % MOD  # 基数平方
        n >>= 1  # n 右移一位

    print(result)

if __name__ == "__main__":
    main()

第二题

题目

牛牛有n种糖果,每种糖果都有足够多,现在牛牛想用这些糖果组成一些糖果盒。每个糖果盒内放m个糖果。对于一个糖果盒,牛牛希望第i种糖果的数量不能少于l_i颗也不能多于r_i颗。满足条件的糖果盒组成方案可能会有很多,牛牛希望你帮他计算一共有多少种糖果盒的拼凑方案。对于两种方案,当有任意一种糖果个数不同,就视为两种不同方案。

输入描述

输入包括n+1行。

第一行包括两个正整数(1 <=n <= 20,1 <= m <= 100),表示糖果的种数和一盒糖果盒的糖果个数。

接下来的n行,每行两个整数l_i, r_i(0 <= l_i <= r_i<= 10),表示第i种糖果的数量限制上下限。

输出描述

输出一个整数,表示满足限定条件的方案数。保证答案在64位整数范围内。

样例输入

3 5

0 3

0 3

0 3

样例输出

12

参考题解

动态规划。定义状态:定义 dp[i][j] 表示前 i 种糖果中,可以凑成 j 个糖果盒的方案数。初始化:初始状态 dp[0][0] = 1,表示使用 0 种糖果凑成 0 个糖果盒只有 1 种方案,即不放糖果。其他 dp[0][j](j > 0)应初始化为 0,因为用 0 种糖果无法凑成正数量的糖果盒。状态转移:dp[i][j] += dp[i-1][j-k]:如果用当前糖果的数量为 k,那前 i-1 种糖果凑成 j-k 个糖果盒的方案数就需要被加到 dp[i][j] 中。表示如果用第 i 种糖果放 k 颗糖果,则剩下的 j-k 个糖果盒的拼凑方案数是由前 i-1 种糖果决定的。对于第 i 种糖果,有 l[i-1] 到 r[i-1] 的数量限制。如果当前糖果的数量限制为 k,可以尝试将其放入糖果盒中,更新 dp[i][j]:最终 dp[n][m] 就是答案。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;

    vector<int> l(n), r(n);
    for (int i = 0; i < n; i++) {
        cin >> l[i] >> r[i];
    }

    // 动态规划数组,dp[i][j] 表示前 i 种糖果凑成 j 个糖果盒的方案数
    vector<vector<long long>> dp(n + 1, vector<long long>(m + 1, 0));

    dp[0][0] = 1;

    for (int i = 1; i <= n; i++) {  // 遍历每一种糖果
        for (int j = 0; j <= m; j++) {  // 遍历糖果盒内的糖果数量
            for (int k = l[i - 1]; k <= r[i - 1]; k++) {  // 当前糖果的可选数量
                if (j >= k) {
                    dp[i][j] += dp[i - 1][j - k];
                }
            }
        }
    }

    cout << dp[n][m] << endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt(); 
        int m = sc.nextInt();

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论
请问笔试要提前准备第二机位嘛
点赞 回复 分享
发布于 09-29 18:27 陕西

相关推荐

1 5 评论
分享
牛客网
牛客企业服务