1. 程式人生 > >計蒜客——購買禮品

計蒜客——購買禮品

計蒜之道比賽馬上開始了,小蒜需要購買一些小禮品用來抽獎。  

小蒜一共帶了 n 位同事前往,第 i 位同事身上攜帶了 p_i  元錢。真巧,禮品店的禮物的單價也正好都是 n。但是禮品店的老闆需要告訴小蒜,他這裡沒有零錢,所以小蒜需要湊到正好買整數個禮物的錢。現在小蒜髮動同事開始湊錢,每位同事要麼不參與湊錢,要麼就把所有的錢交給小蒜。

輸入格式

輸入第一行一個整數 n(1 \le n \le 100000),表示一同前往的同事數量。  接下來一行輸入每個人攜帶的錢的數量 p_i(1 \le p_i \le 100000)

輸出格式

如果蒜頭君不能湊出合適的錢,輸出一行"Sadly"。  

否者第一行輸出參與湊錢的人數 k,接下來一行以任意順序輸出 k 個人的編號(編號從 1 開始)用空格隔開。如果有多個方案,輸出任意一個即可。  

本題答案不唯一,符合要求的答案均正確

樣例輸入

5
1 9 4 2 6

樣例輸出

3
2 3 4
#include<iostream>
#include<cstring>
using namespace std;

int n;
int p[100001];    //第i位同事身上的錢
int pre[100001];  //前i位同事身上共有多少錢
int vis[100001];

void Print(int a, int b) {
	cout << b - a + 1 << endl;
	for (int i = a; i <= b; i++) {
		cout << i;
		if (i != b)cout << " ";
		else cout << endl;
	}
}

int main() {
	
	cin >> n;
	
	for (int i = 1; i <= n; i++) {
		cin >> p[i];
	}

	memset(pre, 0, sizeof(pre));
	for (int i = 1; i <= n; i++) {
		pre[i] = pre[i - 1] + p[i];
	}

	memset(vis, 0, sizeof(vis));
	for (int i = 1; i <= n; i++) {
		if (pre[i]%n == 0) {
			Print(1, i);
			break;
		}
		if (vis[pre[i]%n] == 0) {
			vis[pre[i]%n] = i;
		}
		else {
			Print(vis[pre[i]%n] + 1, i);
			break;
		}	
	}

	return 0;
}