zoukankan      html  css  js  c++  java
  • HDU4045-第二类斯特林数

    题意

    有n台机器,每天选择r台,要求任意两台编号差值不小于k,并且r台机器分成不超过m组。求不重样的选择有多少种组合(可以选多少天)。

    数据范围$1leqslant n,r,k,mleqslant1000$。

    分析

    首先从n个元素中选r个元素,任意两台编号差值不小于k

    可以推断出是把$n-r-(k-1)(r-1)$个相同的球放入$r+1$个盒子里的方案数

    方案数为$inom{n-(k-1)(r-1)}{r}$

    然后把$r$个元素分成$m$组,允许有空组

    方案数为$sum_{i=1}^{m}S(r,j)$

    其中$S$是第二类斯特林数

    结论就是$inom{n-(k-1)(r-1)}{r}sum_{i=1}^{m}S(r,j)$

    注意数据合法性,$ngeqslant (r-1)k+1$

    代码

    #include <map>
    #include <set>
    #include <queue>
    #include <cmath>
    #include <ctime>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #define MAX     1007
    #define MAXN      10007
    #define MAXM      20007
    #define INF  0x3f3f3f3f
    #define NINF 0xc0c0c0c0
    #define MOD  1000000007
    using namespace std;
    typedef long long LL;
    
    LL C[MAX][MAX]={0},S[MAX][MAX]={0};
    //组合数 
    void initC(){
        for(int i=0;i<MAX;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;
            }
        }
    }
    //第二类斯特林数 
    void initS2(){
        for(int i=0;i<MAX;i++){
            S[i][i]=S[i][1]=1;
            for(int j=2;j<i;j++){
                S[i][j]=(S[i-1][j-1]+j*S[i-1][j]%MOD)%MOD;
            }
        }
    }
    int main(){
    	LL n,r,k,m;
    	initC();
    	initS2();
    	while(~scanf("%lld%lld%lld%lld",&n,&r,&k,&m)){
    	    if(n<k*(r-1)+1){
    	        printf("0
    ");
    	        continue;
            }
    		LL ans=0;
    		for(int i=1;i<=m;i++){
    			ans=(ans+S[r][i])%MOD;
    		}
    		ans=ans*(C[n-(k-1)*(r-1)][r])%MOD;
    		printf("%lld
    ",ans);
    	}
        return 0;
    }
    

      

  • 相关阅读:
    Codeforces 798C
    Codeforces 777E
    Codeforces 801C Voltage Keepsake(二分枚举+浮点(模板))
    【NOIP 2017】宝藏
    利普希茨
    【NOIP2008】双栈排序
    捕老鼠
    失格
    【JZOJ4307】喝喝喝
    Blocks
  • 原文地址:https://www.cnblogs.com/shuiming/p/7511705.html
Copyright © 2011-2022 走看看