1. 程式人生 > >Find a multiple POJ - 2356 (抽屜原理)

Find a multiple POJ - 2356 (抽屜原理)

包含 假設 cstring printf 題意 for can n個元素 表示

抽屜原理:   

形式一:設把n+1個元素劃分至n個集合中(A1,A2,…,An),用a1,a2,…,an分別表示這n個集合對應包含的元素個數,則:至少存在某個集合Ai,其包含元素個數值ai大於或等於2。 形式二:設把nm+1個元素劃分至n個集合中(A1,A2,…,An),用a1,a2,…,an表示這n個集合對應包含的元素個數,則:至少存在某個集合Ai,其包含元素個數值ai大於或等於m+1。 形式三:設把n個元素分為k個集合A1,A2,…,Ak,用a1,a2,…,ak表示這k個集合裏相應的元素個數,需要證明至少存在某個ai大於或等於[n/k]。    題意:n個不同的元素,任意一個或者多個相加為n的倍數。找到這些元素。第一個輸出元素的個數,後面分別輸出這些元素。(多種情況輸出一組)   分析:被n求模的余數為 0,1,2,3....n-1 有n個元素,任意幾個數的和為n的倍數,那麽這些和假設為 a1, a2 ,a3 ..... am 那麽m一定大於n      把余數當做抽屜,一定會有至少一個抽屜有兩個元素!就是抽屜原理的形式一。
#include<cstdio>
#include
<cstring> const int maxn = 1e5 + 5; int num[maxn], hash[maxn], sum[maxn]; int n; int main() { while (scanf("%d", &n) != EOF){ memset(hash, 0, sizeof(hash)); for (int i = 1; i <= n; ++i) scanf("%d", &num[i]); int t = 1, s = 1; for (int
i = 1; i <= n; ++i) { sum[i] = (sum[i - 1] + num[i]) % n; if (sum[i] == 0){ t = i; break; } if (hash[sum[i]] > 0){ s = hash[sum[i]] + 1; t = i; break; } hash[sum[i]]
= i; } printf("%d\n", t - s + 1); for (int i = s; i <= t; ++i) printf("%d\n", num[i]); } }

Find a multiple POJ - 2356 (抽屜原理)