小朋友的球

2022-05-12 12:19:11 字數 1682 閱讀 3365

@發源於 小朋友最近特別喜歡球。有一天他腦子抽了,從口袋裡拿出了n個不同的球,想把它們放到m個相同的盒子裡,並且要求每個盒子中至少要有乙個球,他好奇有幾種放法,於是嘗試程式設計實現,但由於他天天不好好學習,只會上b站看游泳教練,於是他向你求助。

輸入格式:

多組資料,每行兩個數n,m。

輸出格式:

每組資料一行,表示方案數。

輸入樣例#1:

4 2

1 1

輸出樣例#1:

7

1

【樣例解釋】

n=4,m=2

1,2 3 4

2,1 3 4

3,1 2 4

4,1 2 3

1 2,3 4

1 3,2 4

1 4,2 3

對於20%的資料,滿足1≤n,m≤10;

對於100%的資料,滿足1≤n,m≤100,資料組數≤10。

stirling數,遞推公式s[i][j]=s[i-1][j]*j+s[i-1][j-1]

s(p,k)的乙個組合學解釋是:將p個物體劃分成k個非空的不可辨別的(可以理解為盒子沒有編號)集合的方法數。

k!s(p,k)是把p個人分進k間有差別(如:被標有房號)的房間(無空房)的方法數。

s(p,k)的遞推公式是:s(p,k)=k*s(p-1,k)+s(p-1,k-1) ,1<= k<=p-1

邊界條件:s(p,p)=1 ,p>=0 s(p,0)=0 ,p>=1

遞推關係的說明:

考慮第p個物品,p可以單獨構成乙個非空集合,此時前p-1個物品構成k-1個非空的不可辨別的集合,方法數為s(p-1,k-1);

也可以前p-1種物品構成k個非空的不可辨別的集合,第p個物品放入任意乙個中,這樣有k*s(p-1,k)種方法。

高精度使用過載運算子會很方便

1 #include2 #include3 #include4 #include5

using

namespace

std;

6struct

node

10};

11 node f[101][101

];12 node operator +(node c,node d)

1324}25

return

h;26

}27 node operator * (node c,long

long

u)2839}

40return

h;41}42

intmain()

43 50

else

if (n==m)

5154

else

5563

64for (i=f[n][m].len;i>=1;i--)

65 printf("

%lld

",f[n][m].a[i]);

66 printf("\n"

);67}68

69}70 }

洛谷P1655 小朋友的球

f i j 表示將i個求放入j個盒子的方案數,考慮第i個球的加入,這個球可能自己乙個盒子,剩下的i 1個球放在j 1個盒子中 也可以先把i 1個求放在j個盒子裡,在把這個球放進任意乙個盒子 綜上f i j f i 1 j 1 f i 1 j j。高精度。組合數 高精度 include include...

小朋友的數字

小朋友的數字 用動態規劃用fcur i 表示以座標i為右端點的區間最大和 f i 表示前i個元素中的區間最大和,也就是特徵值 轉移方程見 然後求解過程也很簡單 但是注意,簡單加減會導致爆longlong,所以,如果確定f 1 不是最大值,那麼就在過程中,對求出的最大值進行取模,以防爆longlong...

小朋友排隊

n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3 依次類推...