URAL
来源:互联网 发布:如何查看手机网络制式 编辑:程序博客网 时间:2024/06/04 19:30
首先这个题一定有解
每个数对 n 取模后不会影响最后结果,所以计算 sum [ i ] 表示前 i 个的和,当sum [ i ] 等于0时 说明是 n 的倍数
否则 我们可以知道 所有的 n 个 sum 包括 1 - (n-1) 这 n-1个数,所以一定有两个 sum 是相同的,也就是说他们之间的和满足n的倍数
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 20000 + 7;int n;int a[maxn];int sum[maxn];int id[maxn];int main() { while(~scanf("%d", &n) && n) { sum[0] = 0; memset(id, 0, sizeof id); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); for(int i = 1; i <= n; ++i) { sum[i] = ( sum[i-1] + a[i] ) % n; if(sum[i] == 0) { printf("%d\n", i); for(int j = 1; j <= i; ++j) printf("%d\n", a[j]); break; } else { if(id[sum[i]] > 0) { printf("%d\n", i - id[sum[i]]); for(int j = id[sum[i]]+1; j <= i; ++j) printf("%d\n", a[j]); break; } id[sum[i]] = i; } } } return 0;}
阅读全文
1 0