poj3370 鸽笼原理

题意:首先输入c n,接着是n个数,问你有没有k个数(1<=k<=n),使得其和能整除c

输出其对应下标,只输出一组符合条件的就行;

分析:http://blog.csdn.net/bigsungod/article/details/41450729

代码:

#include <queue>

#include <stack>

#include <math.h>

#include <vector>

#include <limits.h>

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <algorithm>

#include <functional>

#define N 100010

#define LL long long

#define mem(a) memset(a,0,sizeof(a));

#define mem_1(a) memset(a,-1,sizeof(a));

using namespace std;

int n,c;

int f[N];

int sum[N];

int pos[N];

void work()

{

int j;

memset(pos, -1, sizeof(pos));

pos[0] = 0;

for (int i = 1; i <= n; i++)

if (pos[sum[i]] == -1)

pos[sum[i]] = i;

else

{

for ( j = pos[sum[i]] + 1; j < i; j++)

printf("%d ", j);

printf("%d\n", j);

return;

}

}

int main()

{

while(scanf("%d%d", &c,&n)){

if(c==0&&n==0)

break;

for (int i = 1; i <= n; i++)

scanf("%d", &f[i]);

sum[0] = f[0] = 0;

for (int i = 1; i <= n; i++)

sum[i] = (sum[i - 1] + f[i]) % c;

work();

}

return 0;

}

				
时间: 2024-10-15 14:56:57

poj3370 鸽笼原理的相关文章

UVA 10620 - A Flea on a Chessboard(鸽笼原理)

UVA 10620 - A Flea on a Chessboard 题目链接 题意:给定一个跳蚤位置和移动方向,现在在一个国际象棋棋盘上,左下角为黑格,一个格子为s*s,判断能否移动到白格子,问要移动多少次才能到白格,边界不算白格. 思路:利用鸽笼原理落在黑格子和边界上的一共有(s + 1)^2个点,也就是说,如果形成循环,周期肯定在这之内,所以可以不断去模拟跳格子,直到踩到白格,或者踩到之前落到过的黑格就结束 不过其实还有更优的方法,因为跳蚤跳跃路径为直线,观察下可以发现如果可以到白格,最多

HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场

题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<10^5,点的坐标值m<10^5. 题解:表面上这道题复杂度是O(n^2)会超时的,而实际上这些坐标差绝对值的和最大是2*10^5,所以复杂度不是O(n^2),而是O(min(n^2,m)),这就是著名的鸽笼原理. #include <iostream> #include <cstdio

POJ 2356 Find a multiple (dp + 鸽笼原理)

OJ题目:click here~~ 题目分析:n个数,从中取若干个数,和为n的倍数.给出一种取法. 因为只要给出其中一种方案就行,鸽笼原理可以求出取出的数为连续的方案. 关于鸽笼原理,点这里~ 直接贴过来: 有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两个以上物品. 如果你知道这个结论: a1,a2,a3...am是正整数序列,至少存在整数k和r,1<=k<r<=m,使得ak+a(k+1)+...+a(r)是m的倍数. 证明比较简单: Sk表示前k个数之和

UVA 11237 - Halloween treats(鸽笼原理)

11237 - Halloween treats 题目链接 题意:有c个小伙伴,n个房子(c <= n),每个房子会给ai个糖果,要求选一些房子,使得得到的糖果能平均分给小伙伴,输出方案 思路:c <= n 这个条件很关键,如果有这个条件,那么就可以开一个sum[i]记录0 - i的前缀和%c的值,这样一来在长度n的数组中,必然会出现重复的两个值,用sum[i] - sum[j] == 0这个区间就必然是所求的答案 代码: #include <cstdio> #include &l

[51NOD1103] N的倍数(鸽笼原理)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1103 这题一脸组合数学鸽笼原理例题的样子. 这个问题自己其实YY过很久了,结果今天看到又给忘了.大概是因为没有手写过,希望下次不再忘了. 求前缀和,再对n取模.假如有模为0的,那么就直接拿出来前1~i个数. 如果没有0,那么模数只有n-1个,相对与一共有n个前缀和,根据鸽笼原理,必然有一个模数出现了两次,那这出现了两次的模数位置找出来,把这些数输出就行了.

poj3370Halloween treats(鸽笼原理)

题目链接: 传送门 思路: 这个是鸽笼原理的题目...看了一下这个原理,对此的理解是分为三点.. c代表人的数目,n代表家庭的数目.. [1]首先要求前缀和,然后对此取余,首先如果出现余数为0的情况,那么说明前n项就已经满足了条件,那么这就是其中的一组可行解... [2]但是如果没有出现0呢??那么就看同余了..如果在两个点处出现同余,说明什么??说明从上一个出现同余的后一个数到这个数的和为c的倍数,那么就得到了一组可行解.. [3]题目说没有情况则输出"no sweetws",但是说

poj2356Find a multiple(鸽笼原理)

题目链接: huangjing 思路: 详见传送门 题目: Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6015   Accepted: 2609   Special Judge Description The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each of that num

hdu1205 吃糖果(鸽笼原理)

题目链接: huangjing 思路: 这个题我是这样想的,把其他颜色的糖果当成挡板,必过有n个,那么就可以形成n+1个位置,那么如果n+1大于最大堆糖果树,那么就可以吃到所有不同的糖果,但是有可能会说,万一其他颜色的糖果冲突呢????但是因为其他每种颜色的糖果的数目必然小于最大的,那么可以把这些插入到最大堆的糖果和其他颜色中,相当于加大板子的厚度.... 题目: 吃糖果 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/

鸽笼原理的运用HDU1205

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1205 题目解析:开始没看清题,WA了一发,以为只要最大的次大的差2就是NO,后来仔细看过之后才发现,,,,这题要用隔板法来求解 1.把某种糖果看做隔板,如果某种糖果有n个,那么就有n+1块区域,至少需要n-1块其他种糖果才能使得所有隔板不挨在一块..也就是说能吃完这种糖果.至少需要其他种类糖果n-1块..(鸽巢原理) 2.数量最多的糖果(隔板)可以构造最多的空间,如果这种糖果有maxn个....那么