一个给定的正整数序列,在每个数之前都插入 + 号或 - 号后计算它们的和。
比如序列:1、2、4,共有8种可能的序列
(+1) + (+2) + (+4) = 7
(+1) + (+2) + (-4) = -1
(+1) + (-2) + (+4) = 3
(+1) + (-2) + (-4) = -5
(-1) + (+2) + (+4) = 5
(-1) + (+2) + (-4) = -3
(-1) + (-2) + (+4) = 1
(-1) + (-2) + (-4) = -7
所有结果中至少有一个可被整数k整除,我们则称此正整数序列可被k整除。
例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。
注意:0、-3、-6、-9……都可以认为是3的倍数。
输入样例
3 2
1 2 4
输出样例
NO
/*
f[i][j]:前i个数到达余数是j的情况能不能达到。
如何处理负数:f[i-1][(k+j-a[i]%k)%k]
负数当做正数处理,因为后面的数一起变符号,可以得到相同的状态(处理了负数可以整除的情况)
*/
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[10001],f[10001][101];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
f[0][0]=true;
for(int i=1;i<=n;i++)
for(int j=0;j<k;j++)
f[i][j]=f[i][j]||f[i-1][(k+j-a[i]%k)%k]||f[i-1][(j+a[i]%k)%k];
if(f[n][0]) printf("YES\n");
else printf("NO\n");
return 0;
}