Codeforces 577B Modulo Sum
2016-06-27 21:52
471 查看
http://codeforces.com/problemset/problem/577/B
题意:有n个数,求有无一个子序列满足和是m的倍数
思路:用模下的背包做,发现n是十的六次方级别,但是有个神奇的性质,就是抽屉原理,当n大于等于m的时候,总会有sum[i]和sum[j]满足sum[i]%m=sum[j]%m,于是当n>=m的时候就可以特判掉,DP的复杂度就是O(n^2)的
总结:一定要记住,在模m下的前缀和这样的东西,一定要记得有抽屉原理!
然后这题的XX细节真是坑死我了
题意:有n个数,求有无一个子序列满足和是m的倍数
思路:用模下的背包做,发现n是十的六次方级别,但是有个神奇的性质,就是抽屉原理,当n大于等于m的时候,总会有sum[i]和sum[j]满足sum[i]%m=sum[j]%m,于是当n>=m的时候就可以特判掉,DP的复杂度就是O(n^2)的
总结:一定要记住,在模m下的前缀和这样的东西,一定要记得有抽屉原理!
然后这题的XX细节真是坑死我了
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<iostream> int a[2000005],f[2000005],n,m,g[2000005]; int read(){ int t=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();} return t*f; } int main(){ n=read();m=read(); if (n>m){ printf("YES"); return 0; } for (int i=1;i<=n;i++) a[i]=read(); for (int i=1;i<=n;i++){ for (int j=1;j<=m;j++) g[j]=f[j]; for (int j=m-1;j>=1;j--) if (f[j]) g[(a[i]%m+j)%m]=1; g[a[i]%m]=1; for (int j=0;j<=m;j++) f[j]=g[j]; } if (f[0]) printf("YES"); else printf("NO"); return 0; }
相关文章推荐
- RMI原理揭秘之远程对象
- hdu 2222 Keywords Search
- Swift 造个类型不是梦-白话Swift类型创建
- 堆:欢乐和痛苦
- Leetcode 动态规划DP类题目
- Pocket_PLA算法
- css之缩进
- c++栈和堆
- 关于xpath相对路径前加点与不加点的区别
- Swift Access Control 权限控制的黑与白
- 第一次接触Spring
- C++函数总结归纳
- 最近邻(kNN,k-NearestNeighbor), 贝叶斯(Bayes), BPNN 人工神经网络(BPNN)算法之花的分类
- 使用MAP文件快速定位程序崩溃代码行
- java安全框架-Shiro学习笔记(四)-注解式授权+Jsp标签授权
- 快排
- 一步步教你写StepView(流程指示器)
- 语法总结(Summary of the Grammar)
- (转)通过地址获取对应的源代码信息
- 个性化推荐项目架构