1 条题解
-
0
这段代码是为了解决经典的模运算问题,主要思路是通过前缀和与哈希表来寻找满足条件的子数组。我发现代码中有一个小问题需要修正。
代码问题分析
问题出在处理余数为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; }
修正说明
- 当余数为0时,正确输出从1到i的所有索引
- 单独处理最后一个索引的输出,避免行末空格(某些OJ系统对行末空格敏感)
- 同样的修正也应用到了余数重复的情况,确保输出格式正确
这样修改后,代码应该能够正确处理所有测试用例,包括需要输出完整前缀和的情况。
- 1
信息
- ID
- 2371
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者