抽屉原理的题目,对每个数求前缀和,那么总共有n个前缀和,再分别对c取余,若某个前缀和为0,那么这前几个便是符合题目的答案,如果没有0,由于c<n,根据抽屉原理,所以一定至少有两个前缀和取余后相等,那么这两个数之间的数便符合题意,代码O(n)复杂度
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
int data[100005];
int sum[100005];
int temp[100005];
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)!=-1)
{
if(m==0&&n==0) break;
for(int i=1;i<=n;i++)
scanf("%d",&data[i]);
memset(sum,0,sizeof(sum));
memset(temp,-1,sizeof(temp));
int l,r;
int i,j,k;
temp[0]=0;
sum[0]=0;
for(i=1;i<=n;i++)
{
sum[i]=(sum[i-1]+data[i])%m;
if(temp[sum[i]]==-1)
{
temp[sum[i]]=i;
}
else
{
r=i;
l=temp[sum[i]];
break;
}
}
for(int i=l+1;i<r;i++)
{
printf("%d ",i);
}
printf("%d\n",r);
}
return 0;
}