51nod 1103 N的倍数 抽屉原理

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1103 

No solution的情况是不存在的,如果n个数中存在8的倍数,那么直接输出这个数就好了,如果不存在,n个数对n取余,因为不存在余数为0,所以共n-1种余数,n个中至少有两个余数相同,因此一定存在使得和为8的倍数的情况。

①如果前缀和%n==0,此时前i个数的和为8的倍数,输出前i个数即可

②如果不存在前缀和%n==0,则必然至少存在两个前缀和相同,相减可得到和%n==0的部分

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
int n,a[50005];
int sum[50005];
bool b[50005];
int flag = 0;
int main()
{
    cin >> n;
    sum[0] = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        sum[i] = (sum[i - 1] + a[i])%n;
        if (sum[i] == 0)
        {
            flag = 1;
            cout << i << endl;
            for (int j = 1; j <= i; j++)
                cout << a[j] << endl;
            break;
        }
    }
    memset(b, 0, sizeof(b));
    b[sum[1]] = 1;
    if (!flag)
    {
        for (int i = 1; i <= n; i++)
        {
            if (!b[sum[i]])
                b[sum[i]] = i;
            else
            {
                cout << i - b[sum[i]] << endl;
                for (int j = b[sum[i]] + 1; j <= i; j++)
                    cout << a[j] << endl;
                break;
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Egoist-/p/7445014.html