cf 577B
2015-09-11 11:11
232 查看
B. Modulo Sum
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given a sequence of numbers a1, a2, ..., an,
and a number m.
Check if it is possible to choose a non-empty subsequence aij such
that the sum of numbers in this subsequence is divisible by m.
Input
The first line contains two numbers, n and m (1 ≤ n ≤ 106, 2 ≤ m ≤ 103)
— the size of the original sequence and the number such that sum should be divisible by it.
The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).
Output
In the single line print either "YES" (without the quotes) if there exists the sought subsequence, or "NO"
(without the quotes), if such subsequence doesn't exist.
Sample test(s)
input
output
input
output
input
output
input
output
Note
In the first sample test you can choose numbers 2 and 3,
the sum of which is divisible by 5.
In the second sample test the single non-empty subsequence of numbers is a single number 5. Number 5 is
not divisible by 6, that is, the sought subsequence doesn't exist.
In the third sample test you need to choose two numbers 3 on the ends.
In the fourth sample test you can take the whole subsequence.
题意:从n个数里找任意个的和使其能被m(<=1000)整除。
思路:当n>m时,前m+1个前缀和肯定会出现%m余数相同的情况,那么这两个前缀和的差便能被m整除。
当n<=m便直接用dp求得前i个数所能得出的余数便可。时间复杂度(m*m)。
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given a sequence of numbers a1, a2, ..., an,
and a number m.
Check if it is possible to choose a non-empty subsequence aij such
that the sum of numbers in this subsequence is divisible by m.
Input
The first line contains two numbers, n and m (1 ≤ n ≤ 106, 2 ≤ m ≤ 103)
— the size of the original sequence and the number such that sum should be divisible by it.
The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).
Output
In the single line print either "YES" (without the quotes) if there exists the sought subsequence, or "NO"
(without the quotes), if such subsequence doesn't exist.
Sample test(s)
input
3 5 1 2 3
output
YES
input
1 6 5
output
NO
input
4 6 3 1 1 3
output
YES
input
6 6 5 5 5 5 5 5
output
YES
Note
In the first sample test you can choose numbers 2 and 3,
the sum of which is divisible by 5.
In the second sample test the single non-empty subsequence of numbers is a single number 5. Number 5 is
not divisible by 6, that is, the sought subsequence doesn't exist.
In the third sample test you need to choose two numbers 3 on the ends.
In the fourth sample test you can take the whole subsequence.
题意:从n个数里找任意个的和使其能被m(<=1000)整除。
思路:当n>m时,前m+1个前缀和肯定会出现%m余数相同的情况,那么这两个前缀和的差便能被m整除。
当n<=m便直接用dp求得前i个数所能得出的余数便可。时间复杂度(m*m)。
#pragma comment(linker, "/STACK:102400000000,102400000000") #include<iostream> #include<stdio.h> #include<math.h> #include <string> #include<string.h> #include<map> #include<queue> #include<set> #include<utility> #include<vector> #include<algorithm> #include<stdlib.h> using namespace std; #define eps 1e-8 #define pii pair<int,int> #define inf 0x3f3f3f3f #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define ll long long int #define mod 1000000007 #define maxn 1005 #define maxm 1000005 int f[maxn][2],a[maxm]; int main() { int n,m; rd2(n,m); for(int i=1;i<=n;i++) rd(a[i]); memset(f,0,sizeof(f)); if(n>m) printf("YES\n"); else{ int pr=0; int nt=1; for(int i=1;i<=n;i++){ nt^=1;pr^=1; for(int j=0;j<m;j++){ f[a[i]%m][nt]=1; if(f[j][pr]) f[(j+a[i])%m][nt]=f[j][nt]=1; } } if(f[0][nt]) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
相关文章推荐
- 作为程序员你必须知道的几点
- java并发基础
- MySQL性能分析工具profile的使用(1)
- hadoop1.0的伪分布安装
- Application.OpenURL不同平台的使用
- [算法] 胜者树实现
- 重装系统时断电或强制关机导致硬盘故障的解决
- 分享一个ip地址库,有免费的
- win7系统安装软件时IE提示禁止安装无效签名怎么办?
- 托业考试要准备什么资料【zhasite】
- Spark学习笔记之-Spark Standalone(环境搭建)
- win7设置护眼模式
- 小马哥--高仿红米note 主板型号m8207 日期版本为15年324,拆机主板图与开机图
- ClassLoader, JavaAgent, Aspectj Weaving一站式扫盲帖
- android 使用zxing生成中间嵌套logo的二维码
- 类与类之间的几种关系
- PCB布线的一些经验总结
- 生命周期
- 回望英语-5
- MYSql存储过程的作用及语法