题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1808
题面
题意
给一个长为
N
N
N的数组a[],找出若干个元素使得这些元素的和
m
o
d
mod
mod
c
c
c的值为0(也就是和为
c
c
c的整数倍)。若找不到合乎要求的元素则输出"no sweets"(不含引号),找到了则输出每个元素对应的下标。
思路
很有意思的一道题,看数据做题观察发现数据范围有限定c<=n,那么直接枚举
i
i
i计算依次选取
a
1
a_1
a1~
a
i
a_i
ai可得的元素和(也就是算前缀和),考虑不选的情况,那么共有
n
+
1
n+1
n+1个前缀和,所以至少存在两个前缀和
m
o
d
mod
mod
c
c
c的值相等,记录一下输出即可。
AC代码
#include<stdio.h>
#include<algorithm>
using namespace std;
long long a[100005];
long long flag[100005];
int n,c,cot;
void printans(int now)
{
printf("1");
for(int i=2;i<=now;i++) printf(" %d",i);
printf("\n");
}
void printans(int l,int r)
{
printf("%d",l);
for(int i=l+1;i<=r;i++) printf(" %d",i);
printf("\n");
}
int main()
{
while(1)
{
for(int i=1;i<=n;i++)flag[i]=0;
scanf("%d%d",&c,&n);
if(!(c+n))return 0;
cot=0;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
cot+=a[i];
cot%=c;
if(!cot)
{
printans(i);break;
}
if(flag[cot])
{
printans(flag[cot]+1,i);break;
}
flag[cot]=i;
}
}
return 0;
}