codeforces 377B Modulo Sum(数学,dp)
2015-09-12 11:30
316 查看
题目链接:http://codeforces.com/contest/577/problem/B
题意:给你n个数,从中随机取几个数,使得这几个数的和是m的倍数,如果存在这样一组数,输出yes,否则输出no
思路:首先,当n>m时,肯定有符合条件的,由同余定理可以得到,将这前n项和对m取余的结果用一个数组表示,则因为n大于m,必然存在两个相等的数s1,和s2,则这两个数中间的那些数字之和就能整除m。其次,对于n<m的情况,用一个数组dp[i][j]标记这个和有没有出现过,如果没有,那么就标记为1,dp[i][j]表示i个数里,和为j的这个数字有没有出现过,最后只需要判断dp
[m]是不是等于1就行
代码:
题意:给你n个数,从中随机取几个数,使得这几个数的和是m的倍数,如果存在这样一组数,输出yes,否则输出no
思路:首先,当n>m时,肯定有符合条件的,由同余定理可以得到,将这前n项和对m取余的结果用一个数组表示,则因为n大于m,必然存在两个相等的数s1,和s2,则这两个数中间的那些数字之和就能整除m。其次,对于n<m的情况,用一个数组dp[i][j]标记这个和有没有出现过,如果没有,那么就标记为1,dp[i][j]表示i个数里,和为j的这个数字有没有出现过,最后只需要判断dp
[m]是不是等于1就行
代码:
#include <iostream> #include <cstdio> #include <ctime> #include <cstring> #include <cstdlib> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <deque> #include <complex> #include <string> #include <cmath> #include <climits> #include <algorithm> using namespace std; int n,m,a[1000006]; int dp[1005][1005]; int main() { while(scanf("%d%d",&n,&m)!=EOF) { int flag=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); a[i]=a[i]%m; if(a[i]==0) flag=1; } if(n>m||flag) { puts("YES"); continue; } memset(dp,0,sizeof(dp)); for(int i=0;i<=n;i++) dp[i][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-1])%m]||dp[i-1][j]); if(dp [m]) puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- ios ftp开发中的一个NSString问题
- ASP 生成缩略图
- IE以及其他浏览器主页被劫持到www.2345.com/?kunown的解决办法
- EQueue文件持久化消息关键点设计思路
- jquery ajax提交表单数据的两种方式
- Linux 下启动、关闭tomcat 杀掉进程等命令
- 关于 configure.in 文档中的若干笔记
- NS_ENUM & NS_OPTIONS 枚举
- 求两点间的距离
- CCF 201409-2 画图 题解
- SOAP的简单理解
- poj 1719 Shooting Contest
- 多级放大电路耦合方式的优缺点
- ios 动态计算文本的高度或宽度
- setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key lable1.'
- Android:Tab切换方法整理
- IOS 按钮(button)用法与属性实例
- linux内核裁剪及编译可加载模块
- Linux环境下安装mysql
- 数据结构实践项目——链表