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