3 2 100 25
6 354076161
Stirling数,又称斯特灵数,在组合数学中,Stirling数可指两类数,第一类是有正负的,其绝对值是包含n个元素的集合分作K个排列的方法数目。第二类Stirling数是把包含n个元素的集合划分为正好K个非空子集的方法数目。
本题描述即要求没个桌子最少要用一次即是第二类Stirling数 然后每次可以用任意个桌子 使用总方案数为 S[N][M]*M!
ACcode:
#include <map> #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <stdlib.h> #include <iostream> #include <algorithm> #define maxn 105 #define ll long long const ll mod=1e9+7; using namespace std; ll stirling[maxn][maxn]; void init(){ memset(stirling,0,sizeof(stirling)); stirling[1][1]=1; for(ll i=2;i<=maxn;++i) for(ll j=1;j<=i;++j) stirling[i][j]=(stirling[i-1][j-1]+j*stirling[i-1][j])%mod; } int main(){ int a,b;init(); while(~scanf("%d%d",&a,&b)){ ll ans=stirling[a][b]; for(int i=2;i<=b;++i)ans=(ans*i)%mod; cout<<ans<<'\12'; } return 0; }