3 5
2 3 4
————int64.。。。
抽屉定理:s[i] = a[1]+...+a[i],c[i] = s[i]%n;
因为c[i]最多有n种可能,我们不考虑c[i]==0的情况,所以有N-1种情况,所以根据抽屉原理,这n个数至少有一个c[i]彼此等于,即c[j] - c[i] ==0,即s[j]%n - s[i]%n ==0----->(s[j]-s[i])%n==0------->i+1到j是满足条件的。
简单一句话,c[0]出现一次即可,c[n!=0]出现两次即可。
#include<stdio.h>
#include<string.h>
int a[100010],b[100010],c[100010];
__int64 s[100010];
int main(){
int n,m;
while(scanf("%d%d",&n,&m),n||m){
memset(c,-1,sizeof(c));
s[0] = 0;
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
s[i] = s[i-1]+a[i];
}
c[0] = 0;
for(int i=1;i<=m;i++){
int j;
if(c[s[i]%n]!=-1){
for(j=c[s[i]%n]+1;j<i;j++)
printf("%d ",j);
printf("%d\n",i);
break;
}
c[s[i]%n] = i;
}
}
}