鴿巢原理簡單應用

2021-06-23 04:51:11 字數 1701 閱讀 8679

從n個數裡面取出一些數,這些數的和是n的倍數。並輸出這些數。

先預處理出前n個數的和用sum[i]表示前i個數的和。若某個sum[i]是n的倍數,直接輸出前i個數即可。

否則說明n個數中對n取餘的結果有n-1種,即餘數為(1~n-1),根據鴿巢原理知必定至少存在兩個sum[i]與sum[j]對n取餘的結果相等。那麼i+1 ~ j之間的數之和一定是n的倍數。

#include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define _ll __int64

#define eps 1e-12

#define pi acos(-1.0)

using namespace std;

const int maxn = 10010;

int main()

} if(flag == 1)

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

//printf("sumi : %d\n",sum[i]);

int s,t;

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

}printf("%d\n",t-s);

for(int i = s+1; i <= t; i++)

}return 0;

}

與上題類似。只不過是取若干個數的和是m的倍數。跑一遍迴圈剛好,邊雜湊sum[i],邊判斷sum[i]是否等於0,一旦為0就輸出,否則直到找到兩個相等的sum[i]和sum[j],輸出i~j即可。

#include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define _ll __int64

#define eps 1e-12

#define pi acos(-1.0)

using namespace std;

const int maxn = 100010;

int n,m;

int a[maxn];

int sum[maxn];

int hash[maxn];

int flag;

int s,t;

int main()

}else

flag = 1;}}

}}

return 0;

}

鴿巢原理小結

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

11 抽屜原理 鴿巢原理

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

鴿巢原理 Ramsey數

這個原理聽起來會非常簡單,但是實際運用卻需要極大的構思能量 把n 1個物體放入n個盒子中,則至少有乙個盒子內有兩個或兩個以上物體。什麼當作盒子什麼當作物體是關鍵 例1 在邊長為2的正方形中5個點,至少存在兩個點,使得它們之間的距離小於等於2 2 顯然成立 例2 經典 任意一群人中至少存在兩個人,他們...