1 条题解

  • 0
    @ 2025-5-27 22:05:30

    这段代码是为了解决经典的模运算问题,主要思路是通过前缀和与哈希表来寻找满足条件的子数组。我发现代码中有一个小问题需要修正。

    代码问题分析

    问题出在处理余数为0的情况。当找到一个前缀和的余数为0时,代码直接输出从1到当前索引的所有邻居,但题目要求输出的索引是从1开始的连续子数组,而不是从1到当前索引的所有索引。

    修正后的代码

    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    ll sum[100008],mod[100008];
    int main()
    {
      ll n,c;
      while(scanf("%lld%lld",&c,&n)!=EOF)
      {
        if(c==0&&n==0) break;
        memset(mod,0,sizeof(mod));
        for(int i=1;i<=n;i++)
        {
            ll temp;
            scanf("%lld",&temp);
            sum[i]=sum[i-1]+temp;
        }
        for(int i=1;i<=n;i++)
        {
            if(sum[i]%c==0)
            {
                // 修正:直接输出从1到i的索引
                for(int j=1;j<i;j++)
                {
                    printf("%d ",j);
                }
                printf("%d\n",i);  // 单独输出最后一个索引,避免行末空格
                break;
            }
            if(mod[sum[i]%c]!=0)
            {
               int j=mod[sum[i]%c]+1;
                for(;j<i;j++)
                {
                    printf("%d ",j);
                }
                printf("%d\n",i);  // 单独输出最后一个索引,避免行末空格
               break;
            }
            mod[sum[i]%c]=i;
        }
       }
        return 0;
    }
    

    修正说明

    1. 当余数为0时,正确输出从1到i的所有索引
    2. 单独处理最后一个索引的输出,避免行末空格(某些OJ系统对行末空格敏感)
    3. 同样的修正也应用到了余数重复的情况,确保输出格式正确

    这样修改后,代码应该能够正确处理所有测试用例,包括需要输出完整前缀和的情况。

    • 1

    信息

    ID
    2371
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者