hdu 1808
题目大意:
已知
m
堆糖果的数量,挑选其中一堆或多堆(可全选)的和恰好能被整除no sweets
;
思路:
记录前缀和的取模
n
的值为
存在
re[j].rem−re[i].rem=0
;即说明
ans=⎛⎝∑p=i+1ja[p]⎞⎠%n=0
;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define N 100005
#define LL __int64
using namespace std;
struct node
{
int rem;
int p;
}re[N];
int a[N];
bool cmp(node s, node t)
{
if (s.rem == t.rem)
{
return s.p < t.p;
}
return s.rem < t.rem;
}
int main()
{
int p, n;
while (~scanf("%d%d", &p, &n) && (n || p))
{
int pi = -1;
LL sum = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
sum += a[i];
re[i].rem = sum % p;
re[i].p = i + 1;
if (re[i].rem == 0 && pi == -1)
{
pi = i;
}
}
if (pi == -1)
{
sort(re, re + n, cmp);
int pi_2;
for (int i = 0; i < n - 1; i++)
{
if (pi == -1 && re[i].rem == re[i + 1].rem)
{
pi = re[i].p;
pi_2 = re[i+1].p;
break;
}
}
if (pi == -1)
{
printf("no sweets\n");
}
else
{
for (int i = pi + 1; i < pi_2; i++)
{
printf("%d ", i);
}
printf("%d\n", pi_2);
}
}
else
{
for (int i = 0; i < pi; i++)
{
printf("%d ", i + 1);
}
printf("%d\n", pi + 1);
}
}
}