算法入门
题意
有n个数字,需要选出一些数字使得这些数字之和能被m整除
输入
先输入n,m。0<n,m<2e5
接下来输入n个数字ai
输出
如果可以找出一个方案满足要求,输出Yes,否则输出No。
样例输入
5 3
5 4 4 4 4
样例输出
Yes
思路
我们会发现一个整数求余m的结果只会有m种,分别是0~m-1 。 然后对题目给的n个数搞一个前缀和,每个前缀和对m求余一次。总共有n个前缀和,即对m求余n次,会得到n个结果。
假设1 ~ i 的前缀和求余m等于k,1 ~ j 的前缀和求余m也等于k,那么 i ~ j 区间的数字的和求余m就等于0
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int co[maxn],ww[maxn];
int main(){
int n, m, q;
long long sum = 0;
cin >> n >> m;
co[0] = 1;
for(int i = 1; i <= n; i++){
cin >> ww[i];
sum += ww[i];
if(!co[sum%m]) co[sum%m] = i;
else{
printf("Yes\n");
return 0;
}
}
printf("No\n");
}