分析&&题解:
题意就是给出一个数列,问有没有一个子序列能被c整除。
组合数学中由如下结论:
设 a1,a2,...,am 是正整数序列,则至少存在整数 k 和l , 0≤k<l≤m ,使得 m|(ak+1+ak+2+...+al) 。
所以这道题肯定有解,且需要满足如下条件:- 若 Sk ,前k个数就是m的倍数
- 如果 Sn 与 St 模 m 同余,那么从t+1到n这些数之和模m等于0.
参考代码:
#include<iostream>
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include<cstring>
using namespace std;
const int N=100009;
int n,m;
int a[N];
int sum[N];
int hash[N];
int main()
{
while(scanf("%d%d",&n,&m),n+m)
{
memset(hash,0,sizeof(hash));
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
int s=1,t=1;
sum[0]=0;
for(int i=1;i<=m;i++)
{
sum[i]=(sum[i-1]+a[i])%n;
if(sum[i]==0)
{
t=i;
break;
}
if(hash[sum[i]]>0)//若由同余的情况即找到了解
{
s=hash[sum[i]]+1;
t=i;
break;
}
hash[sum[i]]=i;//保存每一个余数
}
for(int i=s;i<t;i++)
printf("%d ",i);
printf("%d\n",t);
}
return 0;
}