Input
Output
If there are more than one set of numbers with required properties you should print to the output only one (preferably your favorite) of them.
Sample Input
5 1 2 3 4 1
Sample Output
2 2 3
题意:
输入n
输入n个数
判断这n个数中是不是有几个数字之和是n的倍数
思路:
n个数余数分别为 1 ~ n-1 ,相当于有n-1个抽屉,n个物品
分别计算a[1] + a[2] + …… + a[k] 的和然后取余如果为零则直接输出前k个数,否则寻找余数相同的两个数,假设为i, j (i < j),则a[i+1] + . . . . + a[j] 的和一定能被n整除(原理还没想清楚)
AC代码
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int a[10005]; 6 int mod[10005]; 7 int mark[10005]; 8 9 int main() 10 { 11 int n; 12 bool flag = false; 13 cin >> n; 14 memset(mod, 0, sizeof(mod)); 15 memset(mark, 0, sizeof(mark)); 16 for(int i = 1; i <= n; i++) 17 { 18 cin >> a[i]; 19 mod[i] = (mod[i-1] + a[i]) % n; 20 } 21 22 for(int i = 1; i <= n; i++) 23 { 24 if(mod[i] == 0) 25 { 26 flag = true; 27 cout << i << endl; 28 for(int j = 1; j <= i; j++) 29 cout << a[j] << endl; 30 break; 31 } 32 } 33 34 if(!flag) 35 { 36 for(int i = 1; i <= n; i++) 37 { 38 if(mark[mod[i]] == 0) 39 mark[mod[i]] = i; 40 else 41 { 42 cout << i -mark[mod[i]] << endl; 43 for(int j = mark[mod[i]]+1; j <= i; j++) 44 cout << a[j] << endl; 45 46 break; 47 } 48 } 49 } 50 51 return 0; 52 }