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

牛客周赛 Round 108 CDEF题解

C、小苯的数字合并

题意:

小苯有一个长度为 $ n $ 的数组 $ a_1, a_2, \ldots, a_n $,他可以对 $ a $ 进行任意次“数字合并”操作,具体地,一次数字合并操作描述为:

  • 选择一个下标 $ i $ ($ 1 \leq i < |a| $),将 $ a_i $ 和 $ a_{i+1} $ 合并为一个数字,结果为两个的和 $ a_i + a_{i+1} $。合并后数组长度减 1,下标按新数组重新编号。

现在小苯可以进行任意次上述操作,他想知道他可以得到多少种本质不同结果数组,请你帮他数一数吧。换句话说,在可以进行任意次操作的情况下,所有可能得到的数组 $ a $ 有多少种本质不同的模样。由于答案可能很大,请将答案对 $ 998,244,353 $ 取模后输出。

思路:

对于任意的合并操作,数组一定改变。
数组长度:2 3 ... n
res: 2 4 ... \(2^{n - 1}\)
直接输出\(2 ^ {n - 1}\)即可

代码

 cout << pow_mod(2, n - 1) << '\n';

D、小苯的子序列权值

题意:

小苯有一个长度为 \(n\) 的序列 \(a_1, a_2, \ldots, a_n\),他认为一个序列的权值为:序列中所有数字的按位与。
现在小苯想知道所有的非空(显然一共 \(2^n - 1\) 个)的子序列\footnote{子序列是指从原序列中选取若干个元素(可以不连续)形成的序列} 中,有多少个子序列的权值是偶数,请你帮他算一算吧。由于答案可能很大,请将答案对 \(998\,244\,353\) 取模后输出。

思路:

考虑用所有子序列的情况减去子序列为奇数的情况
子序列为奇数的情况:序列中所有元素均为奇数,情况有:\(2^{cnt - 1}\)\({cnt为奇数的个数)\)

代码

  cout << (ksm (2, n) - ksm (2, numn) +2 * mod) % mod << "\n";

E、小苯的数字合并

题意:

小苯发现了一些「有趣的」数字,即:数字本身是个完全平方数,且其各个数位之和也是个完全平方数!例如 \(2025\) 本身就是个完全平方数,同时其各个数位之和:\(2 + 0 + 2 + 5 = 9\) 也是个完全平方数,因此小苯认为 \(2025\) 就是个「有趣的」数字。

现在小苯有一个长度为 \(n\) 的序列 \(a_1, a_2, \ldots, a_n\),他可以对 \(a\) 做任意次以下操作:
选择两个不同的下标 \(i, j\) (\(1 \leq i, j \leq n; i \neq j\)),满足 \(a_i \geq 2\),随后将 \(a_i\) 减去 \(1\)\(a_j\) 加上 \(1\)
他想知道,自己至多可以把 \(a\) 中多少个数字变成「有趣的」数字,请你帮他算一算吧

思路:

因为1也是有趣的数字,所以前n-1位均填1,则答案至少为n-1。现在考虑能否填满,即在符合条件的数字中选择n个是否能够刚好填满,考虑dp即可。
dp[i, j] 使用总和为i的数,能否填j个数字

代码

 const int maxn = 20010;
#define ll long long// int a[maxn];
int n;
int x;
ll A(ll x, ll y) {return (x + y) % mod;
}
bool iswan(int x) {int y = sqrt(x);if (y * y != x) {return false;}return true;
}
bool check(int x) {int y = 0;if (!iswan(x)) {return false;}int a = x;while (a) {y += a % 10;a /= 10;}return iswan(y);
}
vector<int> sp = {1, 4, 9, 36, 81, 100, 121, 144, 169, 196, 225, 324, 400, 441, 484, 529, 900, 961, 1521, 1681, 2025, 2304, 2601, 3364, 3481, 3600, 4489, 4624, 5776, 5929, 7225, 7396, 8100, 8836, 9025, 10000, 10201, 10404, 10609, 10816, 11025, 12100, 12321, 12544, 12769, 14400, 14641, 14884, 16900, 17161, 19321, 19600};
const int m = 52;
int dp[maxn][210];
void init() {memset(dp, 0, sizeof(dp));int sum = 20001;n = 101;//     dp[0][0] = 0;
//     for (int i = 1; i < m; ++i) { // 52
//         for (int h = 1; h <= n; ++h) { // 100
//             for (int j = sp[i]; j <= sum; ++j) { // 20000
//                 for (int k = 1; ;++k) {
//                     if (j < sp[i] * k || h < k) {
//                         break;
//                     }
//                     dp[j][h] = max(dp[j][h], dp[j-sp[i]*k][h-k] + sp[i] * k);
//                 }
//             }
//         }
//     }dp[0][0] = 1;for (int i = 0; i < m; ++i) { // 52for (int j = sp[i]; j <= sum; ++j) { // 20000for (int h = 1; h <= n; ++h) { // 100dp[j][h] = max(dp[j][h], dp[j-sp[i]][h-1]);}}}
}
void solve() {scanf("%d", &n);int sum = 0;for (int i = 1; i <= n; ++i) {scanf("%d", &x);sum += x;}//     printf("%d\n", dp[sum][n] == sum ? n : n - 1);printf("%d\n", dp[sum][n] ? n : n - 1);
}
http://www.hskmm.com/?act=detail&tid=10098

相关文章:

  • Redis的使用问题
  • AIGC拾遗:Flash Attention
  • 深度好文-风雨飘摇信竞路
  • Python-CSV库
  • C++小白修仙记_LeetCode刷题_位运算
  • C++小白修仙记_LeetCode刷题_双指针
  • 前路漫漫亦灿灿 往事堪堪亦澜澜
  • 使用uv和pycharm搭建python开发环境
  • lc1032-字符流
  • C++小白修仙记_LeetCode刷题_哈希表
  • 【F#学习】字符串String
  • 现代汽车前瞻杯2025牛客暑期多校训练营3
  • 实用指南:多技术融合提升环境生态水文、土地土壤、农业大气等领域的数据分析与项目科研水平
  • 【F#学习】“变量”?绑定!
  • 2023 CCPC 深圳 F
  • 完整教程:【算法】双指针(三)[快慢指针]-快乐数
  • 9.19做题资料:哈希表查找时间复杂度分析
  • CF2143F Increasing Xor
  • 提到链接,你能想到什么
  • 实用指南:容器逃逸漏洞
  • 三种方式处理SpringBoot全局异常
  • ECT-OS-JiuHuaShan 框架的元推理,是历史性的文明话语权
  • 应对连写与变体:深度学习赋能维吾尔文识别的核心方案与难点解析
  • CMake工具链
  • 20250918 - NGP Token 攻击事件:价格维持机制为攻击者做了嫁衣
  • 【脑电分析系列】第6篇:经典ERP成分解析 — P300、N170、N400等波形与它们代表的认知功能 — 洞察大脑的认知“电信号语言” - 教程
  • 9.19
  • [GDKOI2023 提高组] 游戏 题解
  • CSP-J/S 2025 游记
  • 2025.9.19 计数dp小记