日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数学--数论--鸽巢原理

發(fā)布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学--数论--鸽巢原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鴿巢原理:

所謂鴿巢原理即n+1只鴿子,只有n個巢,則至少有一鴿巢有兩只鴿子。

鴿巢原理又叫抽屜原理,球盒原理。

推廣:

如果要把n個物件分配到m個容器中,必有至少一個容器容納至少?n / m?個物件。(?x?大于等于x的最小的整數(shù))

poj2356 Find a multiple(抽屜原理)

題目大意就是先給出一個數(shù)N,接著再給出N個數(shù),要你從這N個數(shù)中任意選擇1個或多個數(shù),使得其和是N的倍數(shù)

如果找不到這樣的答案 則輸出0

答案可能有多個,只用任意輸出一個解就行。

輸出的第一行是選擇元素的個數(shù)M,接著M行分別是選擇的元素的值

由鴿籠原理可知此題一定有解,不存在輸出0的結(jié)果

分析:

我們可以依次求出a[0],a[0]+a[1],a[0]+a[1]+a[2],…,a[0]+a[1]+a[2]…+a[n];

假設(shè)分別是sum[0],sum[1],sum[2],…,sum[n]

如果在某一項存在是N的倍數(shù),則很好解,即可直接從第一項開始直接輸出答案

但如果不存在,則sum[i]%N的值必定在[1,N-1]之間,又由于有n項sum,有抽屜原理:

把多于n個的物體放到n個抽屜里,則至少有一個抽屜里有2個或2個以上的物體。
則必定有一對i,j,使得sum[i]%N=sum[j]%N,其中i!=j,不妨設(shè)j>i

則(sum[j]-sum[i])%N=0,故sum[j]-sum[i]是N的倍數(shù)

則只要輸出從i+1~j的所有的a的值就是答案

#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define ll long long using namespace std; int n,a[10010],sum,sum0; bool vis[10010]={0};int main() {scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);vis[0]=1;sum=0;for(int i=1;i<=n;i++){sum+=a[i];sum%=n;if (vis[sum]){sum0=0;int s,t=i;if (sum0==sum) s=1;else{for(int j=1;j<=n;j++){sum0+=a[j];sum0%=n;if (sum0==sum) {s=j+1;break;}}}printf("%d\n",t-s+1);for(int j=s;j<=t;j++)printf("%d\n",a[j]);break;}else vis[sum]=1;}return 0; }

一樣的題目,不一樣的感受:
POJ3370 Halloween treats

總結(jié)

以上是生活随笔為你收集整理的数学--数论--鸽巢原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。