POJ 3370 Halloween treats 鸽巢原理

来源:互联网 发布:骚本配件名称及数据 编辑:程序博客网 时间:2024/05/21 14:08

POJ 3370 Halloween treats

题意: 给定n户人家提供的糖果数目,c个小孩选择其中一些用户把糖果拿走,最后平分,不能有剩余。 给出一个方案(c<=n<=100000)

方案:鸽巢原理,用Si表示 前i户人家的糖果数目之和对c求余。n>c,根据鸽巢原理,肯定有两个和值对c求余的值相同,假设Si==Sj,第 (i+1,i+2,i+3,……,j ) 户人家即为答案。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;#define N 100100int Mark[N];int main(){    int n,c;        while(scanf("%d%d",&c,&n),n&&c){        for(int i=0;i<c;i++) Mark[i] = 0;                int x,tot = 0;        Mark[0] = 1;        bool found = false;        int beg,end;        for(int i=1;i<=n;i++){            scanf("%d",&x);            if(!found){                tot += x;                if(tot>=c)  tot%=c;                if(Mark[tot]) {                    beg = Mark[tot];                    end = i;                    found = true;                }else{                    Mark[tot] = i+1;                }            }        }        if(found){            printf("%d",beg);            for(++beg;beg<=end;++beg)   printf(" %d",beg);            printf("\n");        }else{            printf("no sweets\n");        }       }    return 0;    }