题目:
思路分析:
根据鸽笼原理来看 n大于m时候一定可以
然后可以利用dp来干
dp i j 代表前i个数 mod m为j的情况是否存在要看 前面是否存在 ((j-ai)%modm+m)modm是否存在
代码实现:
/*
*@Author: GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
* __----~~~~~~~~~~~------___
* . . ~~//====...... __--~ ~~
* -. \_|// |||\\ ~~~~~~::::... /~
* ___-==_ _-~o~ \/ ||| \\ _/~~-
* __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~
* _-~~ .=~ | \\-_ '-~7 /- / || \ /
* .~ .~ | \\ -_ / /- / || \ /
* / ____ / | \\ ~-_/ /|- _/ .|| \ /
* |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\
* ' ~-| /| |-~\~~ __--~~
* |-~~-_/ | | ~\_ _-~ /\
* / \ \__ \/~ \__
* _--~ _/ | .-~~____--~-/ ~~==.
* ((->/~ '.|||' -_| ~~-/ , . _||
* -_ ~\ ~~---l__i__i__i--~~_/
* _-~-__ ~) \--______________--~~
* //.-~~~-~_--~- |-------~~~~~~~~
* //.-~~~--\
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 神兽保佑 永无BUG
*/
const int MAX=1e6+5;
int dp[1005][1005];
int a[MAX];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dp[0][0]=1;
if(n>m){
cout<<"YES"<<endl;
return 0;
}
int flag=0;
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
int temp=((j-a[i])%m+m)%m;
if(dp[i-1][temp]){
dp[i][j]=1;
if(j==0){
flag=1;
}
}
if(dp[i-1][j]){
dp[i][j]=1;
}
}
}
if(flag) cout<<"YES";
else cout<<"NO";
}