题目大意
这是魔法,不是戏法!(It’s Magic, Not a Trick!)
时间限制:C/C++/Rust/Pascal 2 秒,其他语言 4 秒
空间限制:C/C++/Rust/Pascal 1024 MB,其他语言 2048 MB
“呃……真麻烦,不过真正的魔法师是不会放弃的。”
自称"超高校级的魔法师"的梦野秘密子在自己面前摆了一排共 个附魔护符。第 个护符最初蕴含 单位魔力,且每个 都是正整数。最近她研读了一本积满灰尘的古老魔导书,破译出了一个以极为特殊的方式操纵魔力的咒语。
每施放一次咒语,她必须严格按顺序执行以下两步:
-
注魔:选择任意一个护符,向其中注入恰好 单位自身的魔力,使该护符的魔力增加 。
-
释放:选择任意一个在注魔完成之后魔力至少为 的护符,爆发出耀眼的光芒,从该护符中消耗恰好 单位魔力,使其魔力减少 。两步可以选择同一个护符,也可以选择不同的护符,咒语在这一点上是灵活的。
但有一条关键限制:如果注魔完成之后不存在魔力至少为 的护符,则释放无法进行。此时整个咒语直接失效,什么都不会发生,她试图注魔的那个护符的魔力也保持不变。
只要每一次尝试都能成功、且所有护符的魔力始终保持非负,秘密子就可以任意多次地施放这个咒语。她好奇自己法术的极限:通过选择每次注魔与释放的位置,所有护符剩余魔力之和最小可能是多少?
比起自己算术,她更想去睡一觉,于是她向你——她可靠的助手——求助。由于答案可能很大,你只需要输出答案对 取模的结果。
每个测试点包含多组测试数据。
第一行包含一个整数 (),表示测试数据的组数。接下来是各组测试数据的描述。
每组测试数据的第一行包含两个整数 和 (,)。
第二行包含 个整数 ()。
保证所有测试数据中 的总和不超过 。
对于每组测试数据,输出一个整数——所有护符剩余魔力之和的最小可能值对 取模的结果。
1 | 3 |
1 | 3 |
第一组数据:,所有护符魔力均为 。无论向哪个护符注魔,注魔后魔力最大也只有 ,无法进行释放,因此秘密子一次咒语也无法施放,剩余魔力之和为 。
第二组数据:只有一个护符,魔力为 ,。对该护符注魔得到 ,再对它自身释放,魔力变为 。此后无法继续施放,答案为 。
第三组数据:,初始魔力为 。可以按如下方式施放 次咒语:
| 次数 | 注魔对象 | 释放对象 | 操作后的魔力序列 |
|---|---|---|---|
| 1 | 第 个() | 第 个() | |
| 2 | 第 个() | 第 个() | |
| 3 | 第 个() | 第 个() | |
| 4 | 第 个() | 第 个() | |
| 5 | 第 个() | 第 个() |
此时剩余魔力之和为 ,且无法再继续施放咒语,因此答案为 。
思路讲解
初始放电次数:
1 | // ---------------- 3. 提取“免费放电次数” = “初始注入预算” ---------------- |

1 | for (int i = 0; i < n; i++) |
1 | // ---------------- 5. 用剩余预算反复“复用零符” ---------------- |
1 | // ---------------- 6. 输出 S - (x-1) * R ---------------- |
AC代码
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=84457244
1 | // teamname: Gospel_rock |
1 | // teamname: Gospel_rock |



