算法入门(思维题)

算法入门

题意

有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");
}

猜你喜欢

转载自blog.csdn.net/weixin_44410512/article/details/88676049