@發源於 小朋友最近特別喜歡球。有一天他腦子抽了,從口袋裡拿出了n個不同的球,想把它們放到m個相同的盒子裡,並且要求每個盒子中至少要有乙個球,他好奇有幾種放法,於是嘗試程式設計實現,但由於他天天不好好學習,只會上b站看游泳教練,於是他向你求助。
輸入格式:
多組資料,每行兩個數n,m。
輸出格式:
每組資料一行,表示方案數。
輸入樣例#1:
4 21 1
輸出樣例#1:
71
【樣例解釋】
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 #include5using
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 依次類推...