题目地址:http://poj.org/problem?id=3370
一篇很好的博客:http://www.cppblog.com/pcfeng502/archive/2009/10/18/98902.aspx
#include<stdio.h> #include<string.h> #define maxn 100005 int a[maxn],b[maxn],num; void work(int c,int n) { int sum = 0,t; memset(b,0,sizeof(b)); for(int i = 1; i <= n; i++) { sum += a[i]; t = sum%c; sum %= c; if(t == 0) {//当从第一个元素起到第i个元素的和可以被c整除,则1 -> i 即为所求的一个解 for(int j = 1; j <= i; j++) printf("%d ",j); return ; } else { if(b[t] > 0) {// 当i > j 时sum[i]%c == sum[j]%c 则sum[i] = m*c +r ,sum[j] = n*c + r,sum[i] - sum[j] = m*c - n*c + r - r = (m-n)*c //所以从j的下一个元素开始到到i元素的和可被c整除,则j+1 - i 即为所求解。 for(int j = b[t]+1; j <= i; j++) printf("%d ",j); return; } } b[t] = i; } } void init(int n) {//输入数据, for(int i = 1; i <= n;i++) scanf("%d",&a[i]); } int main() { int c,n; while(scanf("%d%d",&c,&n) != EOF && c+n) { init(n); work(c,n); printf("\n"); } return 0; }