前缀和+抽屉定理 51Nod1103 N的倍数
2016-04-07 23:01
253 查看
传送门:点击打开链接
题意:一个长度为N(<=5e4)的数组A,从A中选出若干个数,使得这些数的和是N的倍数。
例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数。
思路:以前看过抽屉定理,觉得这个定理废话。但是看到这道题,感觉真的好神!
因为只有n个数,如果这n个数中,有其中一个数%n为0,那么肯定是直接输出
如果所有的数%n都不为0,那么就可能为1~n-1里的任何一个,但是有n个数。
这就说明,至少有一个数字,会存在2次!
这样看起来没用,但是如果我是维护前缀和,那就有用了。
如果一个前缀和的值出现了2次,我们都知道,那么这一段区间里的数字之和%n就会等于0,那就是答案了
所以如果这道题模的数字<=n的话,就非常的有意思,如果是>n的话,我就只会用dp搞了,复杂度就只能是O(n*V)
题意:一个长度为N(<=5e4)的数组A,从A中选出若干个数,使得这些数的和是N的倍数。
例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数。
思路:以前看过抽屉定理,觉得这个定理废话。但是看到这道题,感觉真的好神!
因为只有n个数,如果这n个数中,有其中一个数%n为0,那么肯定是直接输出
如果所有的数%n都不为0,那么就可能为1~n-1里的任何一个,但是有n个数。
这就说明,至少有一个数字,会存在2次!
这样看起来没用,但是如果我是维护前缀和,那就有用了。
如果一个前缀和的值出现了2次,我们都知道,那么这一段区间里的数字之和%n就会等于0,那就是答案了
所以如果这道题模的数字<=n的话,就非常的有意思,如果是>n的话,我就只会用dp搞了,复杂度就只能是O(n*V)
#include <map> #include <set> #include <cmath> #include <ctime> #include <stack> #include <queue> #include <cstdio> #include <cctype> #include <bitset> #include <string> #include <vector> #include <cstring> #include <iostream> #include <algorithm> #include <functional> #define fuck(x) cout<<"["<<x<<"]"; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w+",stdout); //#pragma comment(linker, "/STACK:102400000,102400000") using namespace std; typedef long long LL; typedef pair<int, int> PII; const int MX = 5e4 + 5; const int INF = 0x3f3f3f3f; int n, A[MX], vis[MX]; void solve() { for(int i = 1; i <= n - 1; i++) vis[i] = -1; int s = 0; for(int i = 1; i <= n; i++) { s = (s + A[i]) % n; if(~vis[s]) { printf("%d\n", i - vis[s]); for(int j = vis[s] + 1; j <= i; j++) { printf("%d\n", A[j]); } return; } vis[s] = i; } } int main() { //FIN; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &A[i]); solve(); return 0; }
相关文章推荐
- c++第3次实验-个人所得税计算器
- Django模板中的复数显示及国际化
- 136.移动路线
- map遍历的四种方式
- HashMap的扩容及树化过程
- 我的博客生涯开始
- Java序列化与反序列化总结
- 构建之法阅读笔记03
- Spring3.1.1+Jersey2.2+ehcache实现WebApp与服务器接口交互获取令牌及校验过程
- 排查挂马使用到的命令
- 排查挂马使用到的命令
- php中的in_array函数
- 求二叉树节点的深度(2016华为实习)
- 计算几何---判断线段相交(二)
- android后台线程轮询服务器获取推送消息
- 计算机视觉资源库
- 《JavaScript高级程序设计》——对象与继承
- 在 Mac 上打包 PyQT 程序
- 安装apk程序进android
- 第2课 C 到 C++ 的升级