51Nod-1103-N的倍数
2016-08-19 19:16
155 查看
ACM模版
把前缀和求出并对
这是一道特判题,可能有多种解,所以即使输出结果和样例不同,仍然是可以AC的,之前因为没有关注过特判题,所以,纳闷儿了半天(为毛样例都不对却AC了)……
最后说明一点,其实
描述
题解
利用抽屉原理解题。把前缀和求出并对
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; }
相关文章推荐
- 51nod 1103 n的倍数
- 51nod 1103 N的倍数(抽屉原理)
- 51nod 1103-N的倍数(抽屉原理)
- AC日记——N的倍数 51nod 1103
- 51nod 1103 N的倍数 (鸽巢原理)
- 51Nod 1103 N的倍数
- 51nod 1103 N的倍数 思路:抽屉原理+前缀和
- 51nod 1103 n的倍数
- 思维题:抽屉原理 hdu 5776 sum & 51Nod 1103 N的倍数
- 51nod 1103 N的倍数(抽屉原理)
- 51nod 1103 n的倍数
- 51nod-1103 N的倍数(抽屉原理)
- 51nod-1103-N的倍数
- 51nod 1103 N的倍数(抽屉原理)
- 51nod 1103 n的倍数
- 51nod 1103 N的倍数
- 51nod 1103 n的倍数
- 51nod 1103 N的倍数
- 51nod 1103 n的倍数
- 51nod 1103 N的倍数 (抽屉原理)