题目:有N个机器,每天选出R个机器,而且每两个机器的编号差要大于等于K,而且每天将R个机器最多分为M组工作,问最多有多少种方案
题解:
先选出R个机器,然后将R个机器分为m个组
第一步自己打草稿解决,第二部看斯特林数
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=2010;
#define LL long long
#define mod 1000000007
LL s[MAXN][MAXN],c[MAXN][MAXN];
void init()
{
for(int i=1;i<=1000;i++){
s[i][0]=0;
s[i][i]=1;
for(int j=1;j<i;j++)
s[i][j]=(j*s[i-1][j]+s[i-1][j-1])%mod;
}
for(int i=1;i<=2000;i++){
c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
int main()
{
init();
int n,r,k,m;
//freopen("in.txt","r",stdin);
while(scanf("%d%d%d%d",&n,&r,&k,&m)!=EOF)
{
int last=n-r*k+k-1;
if(last<0){
printf("0\n");
continue;
}
LL ans=0;
for(int i=1;i<=m;i++)
ans=(ans+s[r][i])%mod;
ans=c[r+last][r]*ans%mod;
printf("%lld\n",ans);
}
return 0;
}