描述
题解
利用抽屉原理解题。
把前缀和求出并对N
取模,任意等于0
则符合要求,或者任意两个sum[i]=sum[j]
,则[i,j]
内的数的和都满足这个条件。
N
个数对N
取模,相当于N
个抽屉,则至少有一个sum[i]
等于0,或者一对儿sum[i]==sum[j]
(可以理解为sum[i]-sum[j]==0
)。
这是一道特判题,可能有多种解,所以即使输出结果和样例不同,仍然是可以AC的,之前因为没有关注过特判题,所以,纳闷儿了半天(为毛样例都不对却AC了)……
最后说明一点,其实No Solution
这种情况完全不用考虑,一定有解!
代码
#include <iostream>
#include <cstdio>
typedef long long ll;
using namespace std;
const int MAXN = 5e4 + 10;
int A[MAXN];
ll sum[MAXN];
int main(int argc, const char * argv[])
{
int N;
while (cin >> N)
{
int flag = 0;
sum[0] = 0;
for (int i = 1; i <= N; i++)
{
scanf("%d", A + i);
sum[i] = (sum[i - 1] + A[i]) % N;
if (sum[i] == 0) // 从1~相加符合
{
flag = i;
}
}
if (flag) // 输出结果并continue
{
printf("%d\n", flag);
for (int i = 1; i <= flag; i++)
{
printf("%d\n", A[i]);
}
continue;
}
int left = 0, right = 0;
for (int i = 1; i <= N; i++)
{
for (int j = i + 1; j <= N; j++)
{
if (sum[i] == sum[j])
{
left = i + 1;
right = j;
flag = j - i; // 查找到结果
break;
}
}
if (flag) // 查找到则跳出
{
break;
}
}
if (flag)
{
printf("%d\n", flag);
for (int i = left; i <= right; i++)
{
printf("%d\n", A[i]);
}
}
else
{
printf("No Solution\n");
}
}
return 0;
}