博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2356 Find a multiple (鸽巢原理)
阅读量:5084 次
发布时间:2019-06-13

本文共 1249 字,大约阅读时间需要 4 分钟。

题目大意:给定n个数的集合,从中找出一些数使得他们的和可以被n整除.   离散数学课上老师讲过的竟然忘了= =…… 假定n个数为a1,a2,...,an,前n项和分别是S1、S2、...、Sn,那么如果有一个Si模n是0,就是答案,否则,n个数模n的余数只能在 1到n - 1之间,把余数作为抽屉,显然n个数放到n - 1个抽屉里面,肯定有两个数余数相等,这样取它们的差就得到了结果,算法复杂度是O(n)的。  
#include #include #include #include #include #include #include #include #include #include #include #include #define MID(x,y) ((x+y)>>1)using namespace std;typedef long long LL;int a[10010], sum[10010], vis[10010];int main(){    int n;    cin >> n;    for (int i = 0; i < n; i ++){        cin >> a[i];        if (i == 0){            sum[i] = a[i] % n;            continue;        }        sum[i] = (sum[i-1] + a[i]) % n;    }    memset(vis, -1, sizeof(vis));    for (int i = 0 ; i < n; i ++){        if (sum[i] == 0){            cout << i + 1 << endl;            for (int j = 0; j <= i; j ++)                cout << a[j] << endl;            break;        }        else{            if (vis[sum[i]] != -1){                cout << i - vis[sum[i]] << endl;                for (int j = vis[sum[i]] + 1; j <= i; j ++)                    cout << a[j] << endl;                break;            }            else{                vis[sum[i]] = i;            }        }    }	return 0;}
 

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/02/04/4114214.html

你可能感兴趣的文章
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>
Java程序IP v6与IP v4的设置
查看>>
RUP(Rational Unified Process),统一软件开发过程
查看>>
数据库链路创建方法
查看>>
Enterprise Library - Data Access Application Block 6.0.1304
查看>>
重构代码 —— 函数即变量(Replace temp with Query)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
jQuery如何获得select选中的值?input单选radio选中的值
查看>>