Halloween treats
和POJ2356差不多。
其实这样的数列可以有很多,也可以有不连续的,不过利用鸽巢原理就是方便找到了连续的数列,而且有这样的数列也必定可以找到。
#include <cstdio>
#include <cstdlib>
#include <xutility>
int main()
{
int c, n;
while (scanf("%d %d", &c, &n) && c)
{
int *neighbours = (int *) malloc(sizeof(int) * n);
int *sumMod = (int *) malloc(sizeof(int) * (n+1));
int *iiMap = (int *) malloc(sizeof(int) * c);
std::fill(iiMap, iiMap+c, -1);
sumMod[0] = 0;
int L = -1, R = -1;
for (int i = 0; i < n; i++) scanf("%d", &neighbours[i]);
for (int i = 0; i < n; i++)
{
sumMod[i+1] = (sumMod[i] + neighbours[i]) % c;
if (sumMod[i+1] == 0)
{
L = 1, R = ++i;//下标从1起
break;
}
if (iiMap[sumMod[i+1]] != -1)
{
L = iiMap[sumMod[i+1]] + 2, R = ++i; //下标从1起
break;
}
iiMap[sumMod[i+1]] = i;
}
if (R != -1)
{
for (int i = L; i < R; i++)
{
printf("%d ", i);
}
printf("%d\n", R);
}
else puts("no sweets");
free(neighbours), free(iiMap), free(sumMod);
}
return 0;
}