HDU 1808(鸽巢原理)

来源:互联网 发布:如何开淘宝店详细步骤 编辑:程序博客网 时间:2024/05/20 05:58

hdu 1808
题目大意:
已知m堆糖果的数量,挑选其中一堆或多堆(可全选)的和恰好能被整除n,如果存在输出任意种组合的序号,否则输出no sweets;
思路:
记录前缀和的取模n的值为re[i].rem
存在re[j].remre[i].rem=0;即说明ans=p=i+1ja[p]%n=0;

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cstdlib>#define N 100005#define LL __int64using namespace std;struct node{    int rem;    int p;}re[N];int a[N];bool cmp(node s, node t){    if (s.rem == t.rem)    {        return s.p < t.p;    }    return s.rem < t.rem;}int main(){    int p, n;    while (~scanf("%d%d", &p, &n) && (n || p))    {        int pi = -1;        LL sum = 0;        for (int i = 0; i < n; i++)        {            scanf("%d", &a[i]);            sum += a[i];            re[i].rem = sum % p;            re[i].p = i + 1;            if (re[i].rem == 0 && pi == -1)            {                pi = i;            }        }        if (pi == -1)        {            sort(re, re + n, cmp);            int pi_2;            for (int i = 0; i < n - 1; i++)            {                if (pi == -1 && re[i].rem == re[i + 1].rem)                {                    pi = re[i].p;                    pi_2 = re[i+1].p;                    break;                }            }            if (pi == -1)            {                printf("no sweets\n");            }            else            {                for (int i = pi + 1; i < pi_2; i++)                {                    printf("%d ", i);                }                printf("%d\n", pi_2);            }        }        else        {            for (int i = 0; i < pi; i++)            {                printf("%d ", i + 1);            }            printf("%d\n", pi + 1);        }    }}
0 0
原创粉丝点击