3621 . 综合题

阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×,除特殊说明外,判断题 1.5 分,选择题 3 分)

#include <iostream>
#include <string>
using namespace std;

const int P = 998244353,
    N = 1e4 + 10,
    M = 20;
int n, m;
string s;
int dp[1 << M];

int solve() {
    dp[0] = 1;
    for (int i = 0; i < n; i++) {
        for (int j = (1 << (m - 1)) - 1; j >= 0; j--) {
            int k = (j << 1) | (s[i] - '0');
            if (j != 0 || s[i] == '1')
                dp[k] = (dp[k] + dp[j]) % P;
        }
    }
    int ans = 0;
    for (int i = 0; i < (1 << m); i++) {
        ans = (ans + 1 ll * i * dp[i]) % P;
    }
    return ans;
}
int solve2() {
    int ans = 0;
    for (int i = 0; i < (1 << n); i++) {
        int cnt = 0;
        int num = 0;
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                num = num * 2 + (s[j] - '0');
                cnt++;
            }
        }
        if (cnt <= m)(ans += num) %= P;
    }
    return ans;
}

int main() {
    cin >> n >> m;
    cin >> s;
    if (n <= 20) {
        cout << solve2() << endl;
    }
    cout << solve() << endl;
    return 0;
    49
}

假设输入的 s 是包含 n 个字符的 01 串,完成下面点判断题和单选题:

1 . (判断题)

假设数组 dp 长度无限制,函数 solve()所实现的算法时间复杂度是 $O(n*2^m)$。

2 . (判断题)

输入“11 2 10000000001”时,程序输出两个数 32 和 23。

3 . (判断题)

在 n ≤ 10 时,solve()的返回值始终小于$4^10$

4 . (单选题)

当 n=10 且 m=10 时,有多少种输入使得两行的结果完全一致?

5 . (单选题)

当 n<=5 时,solve()的最大可能返回值为?

6 . (单选题)

若 n=8,m=8,solve 和 solve2 的返回值的最大可能的差值为?