Description
给出一个长度为
n
的序列
Input
第一行两个整数
Output
如果存在则输出 YES ,否则输出 NO
Sample Input
3 5
1 2 3
Sample Output
YES
Solution
如果
n≥m
,由鸽巢原理知必然存在一段连续的子序列使得其和被
m
整除,直接输出
否则,以
dp[i][j]
表示从前
i
个数中选出一个子集使得其和模
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=1000005;
int n,m,a[maxn],dp[1005][1005];
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]%=m;
if(n>=m)printf("YES\n");
else
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
{
dp[i][j]=dp[i-1][(j-a[i]+m)%m]+dp[i-1][j];
if(dp[i][j]>2)dp[i][j]=2;
}
if(dp[n][0]==2)printf("YES\n");
else printf("NO\n");
}
}
return 0;
}