HDU4045 Machine scheduling(组合数+斯特灵数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4045

题意:有N个机器,每天选出R个机器,而且每两个机器的编号差要大于等于K,然后将R个机器最多分为M组工作,问最多有多少种方案。

思路:分成M组就是斯特灵数。下面说选出R个机器。假如每两个之间的差值恰好为K,那么还有P=N-(R-1)*K-1个位置。将这些位置分成R组可以有空,有C(P+R,R)种。

i64 C[N][N],S[N][N];



void init()

{

    C[0][0]=1;

    int i,j;

    for(i=1;i<N;i++)

    {

        C[i][0]=C[i][i]=1;

        for(j=1;j<i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;

    }

    for(i=1;i<N;i++)

    {

        S[i][0]=0; S[i][i]=1;

        for(j=1;j<i;j++) S[i][j]=((i64)j*S[i-1][j]+S[i-1][j-1])%mod;

    }

}



int n,R,K,m;



int main()

{

    init();

    Rush(n)

    {

        RD(R,K,m);

        n-=(R-1)*(K-1);

        if(n<0) puts("0");

        else

        {

            i64 temp=0,i;

            for(i=1;i<=m;i++) (temp+=S[R][i])%=mod;

            PR(C[n][R]*temp%mod);

        }

    }

}

  

 

 

你可能感兴趣的:(mac)