POJ 2356 Find a multiple (抽屉原理)
感觉这个题很不错,至少开始真的没想道可以用抽屉原理推出一个结论,然后把这题秒掉。。。。
已知有n个元素,sum[i]表示从1到i所有数的和。。。sum[i]%n可以得到一个剩余系,如果出现0,那么结果就找到了。
如果不出现0,就可以用抽屉原理了。因为剩余系里只有[1,n-1]这些数,但是sum[i]%n会得到n个结果。
n-1个抽屉放n个物品,必定有一个抽屉放的物品数大于等于2。
也就是必定存在sum[j]%n == sum[i]%n。我们假设sum[i] > sum[j],所以有(sum[i] - sum[j])%n = 0; 从而得到结果。
构造大概有O(n)的复杂度吧,开始想写O(n^2)。感觉不靠谱,也没敢写。
//#pragma comment(linker,"/STACK:327680000,327680000") #include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> #include <string> #include <set> #include <functional> #include <numeric> #include <sstream> #include <stack> #include <map> #include <queue>#define CL(arr, val) memset(arr, val, sizeof(arr)) #define REP(i, n) for((i) = 0; (i) < (n); ++(i)) #define FOR(i, l, h) for((i) = (l); (i) <= (h); ++(i)) #define FORD(i, h, l) for((i) = (h); (i) >= (l); --(i)) #define L(x) (x) << 1 #define R(x) (x) << 1 | 1 #define MID(l, r) (l + r) >> 1 #define Min(x, y) (x) < (y) ? (x) : (y) #define Max(x, y) (x) < (y) ? (y) : (x) #define E(x) (1 << (x)) #define iabs(x) (x) < 0 ? -(x) : (x) #define OUT(x) printf("%I64d\n", x) #define Read() freopen("data.in", "r", stdin) #define Write() freopen("data.out", "w", stdout);typedef long long LL; const double eps = 1e-8; const double pi = acos(-1.0); const double inf = ~0u>>2;using namespace std;const int N = 10010;int sum[N]; int a[N]; vector<int> v[N];int main() {//Read();int n, i, j;scanf("%d", &n);for(i = 1; i <= n; ++i) {scanf("%d", a + i);v[i].clear();}sum[0] = 0;for(i = 1; i <= n; ++i) {sum[i] = a[i] + sum[i-1];v[sum[i]%n].push_back(i);if(sum[i]%n == 0) {printf("%d\n", i);for(j = 1; j <= i; ++j) {printf("%d\n", a[j]);}return 0;}}for(i = 1; i <= n; ++i) {if(v[i].size() >= 2) {int l = v[i][0], r = v[i][1];printf("%d\n", r - l);for(j = l + 1; j <= r; ++j) {printf("%d\n", a[j]);}return 0;}}return 0; }
POJ 2356 Find a multiple (抽屉原理)相关推荐
- POJ 2356 Find a multiple 神题 传说中的经典.
题目 Description The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each ...
- poj - 2356 Find a multiple
http://poj.org/problem?id=2356 题意:给你n个数,找出几个数,使他们的和是n的倍数:有多少数组成 ,输出哪几个数 题解:鸽巢原理.(1)当前n项和对n取模为0 输出前n个 ...
- POJ 2356 (抽屉原理)
题目中说:随便输出一组.抽屉原理可以求出取出的数连续的情况. #include <iostream> #include<cstdio> using namespace std; ...
- poj2356(抽屉原理)
题意:从输入的N个元素中找出是N的倍数的元素并且输出: 因为这个要求的是连续的数之和,先用sum数组求和:sum[1],sum[1]+sum[2],--,sum[1]+sum[2]+--+sum[n] ...
- 牛客算法周周练2 B Music Problem(DP,抽屉原理,二进制拆分)
链接:https://ac.nowcoder.com/acm/contest/5203/B 来源:牛客网 题目描述 Listening to the music is relax, but for o ...
- 鸽巢原理(抽屉原理)的详解
抽屉原理 百科名片 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果.这一现象就是我们所说的"抽屉原理". 抽屉原理的一般含义为: ...
- Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理、倒排索、建立查找树、处理Hash冲突、Hash查找)
Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理.倒排索.建立查找树.处理Hash冲突.Hash查找) 目录 一.SimHash算法 1.SimHash算法五个步骤 2. ...
- 14. 不修改数组找出重复的数字【难度: 一般 / 知识点: 抽屉原理 二分】
第一种方法: 开了map计数,多用了空间,map: logn,时间复杂度O(nlogn) class Solution {public:int duplicateInArray(vector<i ...
- hdu 3303(线段树+抽屉原理)
解题思路:这题利用了抽屉原理,即1-M之间的所有数与M+1的模都不相同.那么可以利用它将要查找所有区间分成[1,Y-1],[Y,2*Y-1],[2*Y,3*Y-1].........一直下去,直到所有 ...
最新文章
- CentOS 7部署OpenStack(9)—部署dashboard
- cadence原理图封装pin名称重复_硬件工程师必备技巧--如何快速制作PCB封装
- 向量与向量的叉积和向量与矩阵的叉积数学表达式与python 实现
- python中哪些词是敏感字词_python实现敏感词过滤的几种方法
- 在没有适当上下文的情况下引发异常是一种不良习惯
- c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)
- 电影天堂电影链接爬取
- 更改主机文件引发思考 防火墙URL过滤无奈(转)
- 顺序查找(Linear Search)
- JAVA NIO 实现群聊
- java-php-python-ssm在线教学质量评价系统计算机毕业设计
- arm9开发板重新生成文件系统,并烧写
- webworker应用场景_聊聊webWorker
- 微信小程序之猜拳游戏
- 分享一款windows效率神器,自定义键盘改键(PowerToys)
- request:fail -202:net::ERR_CERT_AUTHORI
- Linux中存储设备的命名规则
- 代达罗斯之殇-大数据领域小文件问题解决攻略
- Tableau已经安装且重装时提示试用期结束了怎么办?(该方法已经过期!请到官网下载免费版,谢谢!)
- 【HTML5学习小结(1)】
热门文章
- 德黑兰大学推可踢球机器人,中国队快买!
- Android开源项目发布jCenter
- 4.Windows下安装ZooKeeper
- java web Junit
- 10.2.2移动产品离线功能等具体解释----暨4月8日移动《在离线一体化》公开课Qamp;A...
- DOS系统里,分屏显示目录的命令是什么??
- 不信iphone5 只要GALAXY S II珠峰仍有信号
- Linux 第60,61天 ansible的playbook
- centos 7--LNMP环境部署
- jdk历史各个版本下载