URAL 1032 Find a Multiple 鸽巢原理

来源:互联网 发布:数独软件 编辑:程序博客网 时间:2024/06/02 16:12

题目大意:

给出N个数,要求从这N个数中选出一些数,使得这些数的和是N的倍数,如果能够找到这样的组合,则输出选出的数的个数和这些数,否则输出0


大致思路:

首先对于N个数,假设前 i 项的和是 S[i], 则S[i] % N 将会对应的有N个值,其中,如果S[i] % N互不相同,则必定是 0,1,2,3,4,5...,N - 1共N个数,这样的话,S[i] % N的那个前i 项便满足题目要求

而如果S[i] % N 不是互不相同,那么,对于 S[i] % N == S[j] % N,必有 (S[i] - S[j]) % N == 0,这样,从第i + 1项到第 j 项就满足题目要求,直接输出即可

如此一来,一定存在满足条件的组合,这也是鸽巢原理的一个妙用


代码如下:


Result  :  Accepted      Memory  :  272 KB     Time  :  62 ms

/* * Author: Gatevin * Created Time:  2014/7/9 23:30:00 * File Name: test.cpp */#include<iostream>#include<sstream>#include<fstream>#include<vector>#include<list>#include<deque>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cctype>#include<cmath>#include<ctime>#include<iomanip>using namespace std;const double eps(1e-8);typedef long long lint;int N;int num[10010];int mod[10010];int main(){    scanf("%d",&N);    mod[0] = 0;    for(int i = 1; i <= N; i++)    {        scanf("%d",&num[i]);        mod[i] = (num[i] + mod[i - 1]) % N;    }    for(int i = 0; i <= N; i++)    {        for(int j = i + 1; j <= N; j++)        {            if(mod[i] == mod[j])            {                cout<<j - i<<endl;                for(int k = i + 1; k <= j; k++)                {                    cout<<num[k]<<endl;                }                return 0;            }        }    }    return 0;}


0 0
原创粉丝点击