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


原创粉丝点击