題目傳送門
我們考慮設 fi,
jf_
fi,j
表示到第 i
ii 個球放入 j
jj 個盒子裡的方案數。
考慮如何轉移,莫過於兩種情況:放入原有的盒子,重新開乙個盒子。
對於第一種情況 fi,
j=fi
−1,j
×j
f_=f_\times j
fi,j=
fi−1
,j×
j 即在原有的箱子中選乙個
對於第二種情況 fi,
j=fi
−1,j
−1×(
m−j+
1)
f_=f_\times (m-j+1)
fi,j=
fi−1
,j−1
×(m
−j+1
) 即在沒選的 m−j
+1
m-j+1
m−j+
1 個盒子裡選擇乙個放入
以及注意列舉 j
jj 的下界為 m−n
+i
m-n+i
m−n+
i 因為要保證盒子非空。
最後答案即 fn,
mf_
fn,m
#pragma gcc optimize(3,"ofast","inline")
#include
#define for(i,a,b) for ( register int i=(a);i<=(b);i++ )
#define dow(i,b,a) for ( register int i=(b);i>=(a);i-- )
#define go(i,x) for ( int i=head[x];i;i=e[i].nex )
#define mem(x,s) memset(x,s,sizeof(x))
#define cpy(x,s) memcpy(x,s,sizeof(x))
#define yes return puts("yes"),0
#define no return puts("no"),0
#define gg return puts("-1"),0
#define pb push_back
#define lowbit(x) x&(-x)
using
namespace std;
inline
intread()
const
int mod=
1e9+7;
const
int mo=
998244353
;const
int n=
1e6+5;
const
int m=
1005
;inline
intmin
(int x,
int y)
inline
intmax
(int x,
int y)
int n,m,f[11]
[11],ans;
intmain()
P1287 盒子與球
miku 這是一道數學題,可以推式子 我推錯了 這是一道dp,完全沒想到它是。所以說我把我的錯誤式子縫縫補補,加上個dfs 過了。大體思想就是利用插板法求出每個盒子可以裝幾個球的方案,然後因為同乙個盒子內部的球是無序的,所以說用一點點排列的知識加上dfs的框架處理一下,然後就過了 include i...
P1287 盒子與球
現有 r個互不相同的盒子和 n個互不相同的球,要將這 n 個球放入 r個盒子中,且不允許有空盒子。請求出有多少種不同的放法。兩種放法不同當且僅當存在乙個球使得該球在兩種放法中放入了不同的盒子。輸入只有一行兩個整數,分別代表 n 和 r。輸出一行乙個整數代表答案。輸入 1複製 3 2 輸出 1複製 6...
洛谷 P1287 盒子與球
現有r個互不相同的盒子和n個互不相同的球,要將這n個球放入r個盒子中,且不允許有空盒子。問有多少種方法?例如 有2個不同的盒子 分別編為1號和2號 和3個不同的球 分別編為1 2 3號 則有6種不同的方法 輸入格式 兩個整數,n和r,中間用空格分隔。0 n,r 10 輸出格式 僅一行,乙個整數 保證...