鴿巢原理入門

2022-05-24 09:39:12 字數 1255 閱讀 7340

下面有兩個入門題目:

poj2356

題意:從n個數中選出幾個數的和是n的倍數。

因為給定的是n個數,所以結論是一定存在。證明如下:

用sum[k]表示前k個數的和,假設不存在,那麼sum[k] % n一定在1到(n-1)之間,其中k為(1~n),那麼它的餘數至少有兩個數是相等的。因為鴿巢原理n個蘋果放到n-1個抽屜裡,假設sum[i] % n == sum[j] % n, 那麼sum[j] - sum[i]就一定可以被n整除。與假設矛盾。所以一定存在。

這個題的具體做法就是,先找sum[1]~sum[n]有沒有能被n整除的,如果有的話,直接找到了。沒有的話繼續把沒個數的餘數儲存下來,那麼下次碰見和這個數餘數相同的話,那麼一定可以被n整除。**如下:

#include #include 

#include

using

namespace

std;

const

int maxn = 10010

;int

sum[maxn];

intb[maxn];

intmain()

for (int i = 1; i <= n; i++)

if (b[sum[i] % n] != 0

)

else

b[sum[i] % n] =i;}}

return0;

}

poj3370

這個題和上乙個題基本上一樣,就是模c而已,正好c又是小於等於n的,所以滿足鴿巢定理,wa了好久,,,發現用long long

#include #include 

#include

using

namespace

std;

const

int maxn = 100010

;typedef

long

long

ll;ll sum[maxn] = ;

intb[maxn];

intmain()

memset(b,

0, sizeof

(b));

for (int i = 1; i <= n; i++)

else

if (b[sum[i] % c] != 0

)

else

b[sum[i] % c] =i;}}

return0;

}

鴿巢原理小結

最基礎的原理便是n 1的物體放到n個盒子裡,至少有乙個盒子放了兩個物體。poj 2356 有n個數,從中選出幾個數的和是n的倍數。不得不說數學是個神奇的東西,結論是任意的n個數,必然能找到連續的m個數之和是n的倍數。接下來簡單證明一下,組合數學書中,黑書都有介紹。sk表示a1 a2 ak,如果sk是...

容斥原理 鴿巢原理快速入門

在計數時,必須不重不漏。為了使得重疊部分不被重複計算,人們研究出一種新的計數方法,這種方法的基本思想是 先不考慮重疊的情況,把包含於某內容中的所有物件的數目先計算出來,然後把計數時重複計算的數目排斥出去,使得計算的結果既無重複也無遺漏,這種計數的方法稱為容斥原理。公式的解釋 目的是求解m個集合的並集...

11 抽屜原理 鴿巢原理

桌上有十個蘋果,要把這十個蘋果放到九個抽屜裡,無論怎樣放,我們會發現至少會有乙個抽屜裡面至少放兩個蘋果。這一現象就是我們所說的 抽屜原理 抽屜原理的一般含義為 如果每個抽屜代表乙個集合,每乙個蘋果就可以代表乙個元素,假如有n 1個元素放到n個集合中去,其中必定有乙個集合裡至少有兩個元素。抽屜原理有時...