您的位置:首页 > 其它

51Nod-1103-N的倍数

2016-08-19 19:16 155 查看
ACM模版

描述



题解

利用抽屉原理解题。

把前缀和求出并对
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  抽屉原理