URAL 1032 Find a Multiple 鸽巢原理

题目大意:

给出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;
}


你可能感兴趣的:(find,multiple,a,鸽巢原理,ural,1032)