题型:组合题
#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 + 1ll * 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;
}当n=10且m=10时,有多少种输入使得两行的结果完全一致?()
| A. 1024 |
B. 11 |
| C. 10 |
D. 0 |
输入“11 2 10000000001”时,程序输出两个数32和23()
| A.正确 | B.错误 |
假设输入的s是包含n个字符的01串,函数solve()所实现的算法时间复杂度是O(n*2m)()
| A.正确 | B.错误 |
若n=8,m=8,solve和solve2的返回值的最大可能的差值为()?
| A. 1477 |
B. 1995 |
| C. 2059 |
D. 2187 |
在n≤10时,solve()的返回值始终小于410()
| A.正确 | B.错误 |
当n≤5时,solve()的最大可能返回值为()?
| A. 65 |
B. 211 |
| C. 665 |
D. 2059 |
更新时间:2025-06-18 13:31:37
|
【知识点】
CCF非专业级别软件能力认证CSP-S/提高级
抱歉! 您未登录, 不能查看答案和解析点击登录












