全部评论 4

  • 4

    2小时前 来自 浙江

    1
  • 用 AI 调不好吗。


    你原来的代码不只是 n == 1 的问题,核心逻辑有漏洞:它只考虑让 n-1 个数取 k-1,剩下一个数取剩余值,但忽略了当 m 较小时,可以让所有数都取较小的余数,此时答案直接就是 m。

    正确的结论:

    • 若 k == 1,任何数模 1 都是 0,答案 0。
    • 设 max_sum = n * (k - 1)。这是所有数余数都取 k-1 时的最大余数和。
    • 如果 m <= max_sum,我们可以构造出总和为 m 且每个数都至少为 1 的序列,使得所有数的余数之和恰好为 m(因为每个数可以取 1 到 k-1 之间的值),所以答案就是 m。
    • 如果 m > max_sum,余数和最大不能超过 max_sum,并且余数和必须与 m 模 k 同余。所以答案是 max_sum 向下调整到与 m 同余 mod k 的最大值。

    修改后的代码如下(按题目要求将其中一个变量命名为 kskDlzdJd):

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll n, m, kskDlzdJd;
    int main() {
        scanf("%lld%lld%lld", &n, &m, &kskDlzdJd);
        ll k = kskDlzdJd;
        if (k == 1) {
            printf("0\n");
            return 0;
        }
        ll max_sum = n * (k - 1);
        if (m <= max_sum) {
            printf("%lld\n", m);
        } else {
            // 需要向上取整,使得 m - t*k <= max_sum
            ll t = (m - max_sum + k - 1) / k;
            ll ans = m - t * k;
            printf("%lld\n", ans);
        }
        return 0;
    }
    

    用你之前错的例子验证:
    n=4, m=6, k=3 → max_sum = 8,m <= max_sum,输出 6(正确,原代码输出 3)。
    n=3, m=11, k=3 → max_sum = 6,m > max_sum,t = (11-6+2)/3 = 2,ans = 11 - 6 = 5(样例输出 5)。

    这样应该能通过所有测试点。

    14小时前 来自 浙江

    0
  • 你是 https://www.luogu.com.cn/user/1368826/article 吗

    14小时前 来自 浙江

    0
  • 顶一下

    18小时前 来自 江苏

    0

热门讨论