noip2008 傳球遊戲 (數論,求組合數)

2021-09-30 12:58:14 字數 1333 閱讀 1778

a1165. 傳球遊戲

時間限制:

1.0s   記憶體限制:

256.0mb

總提交次數:

1153

ac次數:

343   平均分:

53.56

將本題分享到:

檢視未格式化的試題

提交試題討論

試題**

noip2008 普及組

問題描述

上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。

遊戲規則是這樣的:n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個(左右任意),當老師再次吹哨子時,傳球停止,此時,拿著球沒傳出去的那個同學就是敗者,要給大家表演乙個節目。

聰明的小蠻提出乙個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手裡開始傳的球,傳了m次以後,又回到小蠻手裡。兩種傳球的方法被視作不同的方法,當且僅當這兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有3個同學1號、2號、3號,並假設小蠻為1號,球傳了3次回到小蠻手裡的方式有1->2->3->1和1->3->2->1,共2種。

輸入格式

共一行,有兩個用空格隔開的整數n,m(3<=n<=30,1<=m<=30)。

輸出格式

t共一行,有乙個整數,表示符合題意的方法數。

樣例輸入

3 3樣例輸出 2

資料規模和約定

40%的資料滿足:3<=n<=30,1<=m<=20

100%的資料滿足:3<=n<=30,1<=m<=30

解析:我們這樣看,假設0代表球往左傳,右代表球往右傳,那麼m次傳球就可以簡化為乙個長度m的01序列。

球要回到小蠻手上,那麼就有兩方法:

1.序列中0與1的個數相等。這就要求 m 是乙個偶數才行,方案數為c(m,m/2);

2.序列中0與1的個數相差n。這實際上就是m-n次傳球之後,球已回到小蠻手中,然後再沿著某一方向傳n次球。 

**:

#includeusing namespace std;

typedef unsigned long long ull;

const int maxn=30;

ull ans=0,f[maxn+20][maxn+20];

int main()

if(m%2==0)ans+=f[m][m/2];

for(k=m-n;k>=0;k-=n)

if(k%2==0)ans+=f[m][k/2]*2;

printf("%i64u\n",ans);

return 0;

}

noip2008 傳球遊戲

上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此時,拿著球沒傳出去的那個同學...

NOIP2008 傳球遊戲

本著刷一刷noip真題做了這道,寫篇題解加深印象。傳送門 題面總的來說就是n個人圍城個圈,每次傳球只能傳給左邊或右邊,設從1號位發球,求m步傳回1號位的方案數。從1號位開始搜,每次向左右兩邊擴充套件,m步時落在1號位ans 其中1和n的情況需要判斷一下。include include using n...

NOIP 2008 傳球遊戲

洛谷傳送門 jdoj傳送門 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此...