poj3370Halloween treats(鸽笼原理)

题目链接:

传送门

思路:

这个是鸽笼原理的题目。。。看了一下这个原理,对此的理解是分为三点。。

c代表人的数目,n代表家庭的数目。。

【1】首先要求前缀和,然后对此取余,首先如果出现余数为0的情况,那么说明前n项就已经满足了条件,那么这就是其中的一组可行解。。。

【2】但是如果没有出现0呢??那么就看同余了。。如果在两个点处出现同余,说明什么??说明从上一个出现同余的后一个数到这个数的和为c的倍数,那么就得到了一组可行解。。

【3】题目说没有情况则输出“no sweetws”,但是说明情况下出现呢???只有当不出现【1】【2】的情况,当说明时候不出现呢???那么就是n<c的时候可能会出现不可能的情况,因为可能不会出现同余的情况,但是如果n>=c的话肯定会出现两个点处出现同余。。

那么这个问题就解决了。。。

题目:

Halloween treats

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 6638   Accepted: 2451   Special Judge

Description

Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets on that day, no matter how many children call on him, so it may happen that a child will get nothing if it is too late. To avoid conflicts,
the children have decided they will put all sweets together and then divide them evenly among themselves. From last year‘s experience of Halloween they know how many sweets they get from each neighbour. Since they care more about justice than about the number
of sweets they get, they want to select a subset of the neighbours to visit, so that in sharing every child receives the same number of sweets. They will not be satisfied if they have any sweets left which cannot be divided.

Your job is to help the children and present a solution.

Input

The input contains several test cases.

The first line of each test case contains two integers c and n (1 ≤ c ≤ n ≤ 100000), the number of children and the number of neighbours, respectively. The next line contains n space
separated integers a1 , ... , an (1 ≤ ai ≤ 100000 ), where ai represents the number of sweets the children get if they visit
neighbour i.

The last test case is followed by two zeros.

Output

For each test case output one line with the indices of the neighbours the children should select (here, index i corresponds to neighbour i who gives a total number of ai sweets).
If there is no solution where each child gets at least one sweet print "no sweets" instead. Note that if there are several solutions where each child gets at least one sweet, you may print any of them.

Sample Input

4 5
1 2 3 7 5
3 6
7 11 2 5 13 17
0 0

Sample Output

3 5
2 3 4

Source

Ulm Local 2007

代码:

#include<cstdio>
#include<cstring>
const int maxn=100000+10;

int a[maxn],mod[maxn];
int c,n;

int main()
{
    __int64 sum;
    while(~scanf("%d%d",&c,&n))
    {
        if(c==0&&n==0)  return 0;
        sum=0;
        for(int i=1;i<=n;i++)
           scanf("%d",&a[i]);
        for(int i=0;i<c;i++)
            mod[i]=-1;
        for(int i=1;i<=n;i++)
        {
            sum=(sum+a[i])%c;
            if(sum==0)
            {
                for(int j=1;j<i;j++)
                    printf("%d ",j);
                printf("%d\n",i);
                break;
            }
            if(mod[sum]!=-1)
            {
                for(int j=mod[sum]+1;j<i;j++)
                    printf("%d ",j);
                printf("%d\n",i);
                break;
            }
            mod[sum]=i;
        }
    }
    return 0;
}

poj3370Halloween treats(鸽笼原理)

时间: 2024-10-15 03:12:11

poj3370Halloween treats(鸽笼原理)的相关文章

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

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

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

POJ 3370 Halloween treats(抽屉原理)

题意  有c个小孩 n个大人万圣节搞活动  当小孩进入第i个大人家里时   这个大人就会给小孩a[i]个糖果  求小孩去哪几个大人家可以保证得到的糖果总数是小孩数c的整数倍  多种方案满足输出任意一种 用s[i]表示前i个打人给糖果数的总和  令s[0]=0  那么s[i]共有n+1种不同值  而s[i]%c最多有c种不同值  题目说了c<=n   所以s[i]%c肯定会有重复值了 这就是抽屉原理了   n个抽屉放大于n个苹果   至少有一个抽屉有大于等于2个苹果 就把s[i]%c的取值个数(c

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(抽屉原理)

题目链接:uva 11237 - Halloween treats 题目大意:有c个小孩要到邻居家去要糖果,有n户邻居,每户邻居只会提供固定数量的糖果,熊孩子们为了不发生冲突,决定将取来的糖果平均分配,问说取那几家邻居的糖果可以做到平均分配,注意n ≥ c. 解题思路:抽屉原理,求出序列的前缀和,有n个,将前缀和对c取模后,根据剩余系定理肯定是在0~c-1之间的,如果是0那么答案就不用说了,如果两端前缀和同余,则说明中间该段的和是c的倍数.又因为n ≥ c,对于取0的时候肯定是可以有解的,那么n

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

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

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/