zoukankan      html  css  js  c++  java
  • HDU4045_Machine scheduling

    题意为要你从编号为1-n的所有机器中间选择出r个机器且每一个机器的编号只差不小于k-1,然后将选择的r个机器分为m组有多少种方案。

    其实这题目的两个步骤是相互独立的。

    总共的方案数等于选择的方案数乘以分组的方案数。

    对于选择的方案数,我们首先选出(r-1)*k+1个数,这样就保证了选择了r个合法的数。

    然后我们将剩下的数字填入到这r+1个空中去。这样就相当于是把剩余的那个数字分解为r+1个数字的和有多少种方案。(这里可以dp预处理了)

    对于分组的方案数也一样,也是预处理出来的。

    对于新加入的一个数,它可以放在前面的任何一个组,也可以独立为一组,这样就可以了。

    注意,r个数最多分为r组,所以当m>r的时候,直接m=r即可。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define M 1000000007
    #define ll long long
    #define maxn 1010
    using namespace std;
    
    ll P[maxn],f[maxn][maxn],g[maxn][maxn];
    ll sum[maxn][maxn];
    ll n,m,k,r;
    
    int main()
    {
        for (int i=1; i<maxn; i++) f[0][i]=1,sum[0][i]=1;
        for (int i=1; i<maxn; i++)
        {
            for (int j=0;j<maxn;j++) sum[i][j]=sum[i-1][j];
            f[i][1]=1,sum[i][1]=(sum[i][1]+f[i][1])%M;
            for (int j=2; j<maxn; j++)
            {
                  f[i][j]=(f[i][j]+sum[i][j-1])%M;
                  sum[i][j]=(sum[i][j]+f[i][j])%M;
            }
        }
    
        g[1][1]=1;
        for (int i=2; i<maxn; i++)
        {
            g[i][1]=1;
            for (int j=2; j<=i; j++)
            {
                g[i][j]=(g[i-1][j]*j+g[i-1][j-1])%M;
            }
        }
    
        for (int i=1; i<maxn; i++)
            for (int j=1; j<=i; j++) g[i][j]=(g[i][j-1]+g[i][j])%M;
        
        while (scanf("%I64d%I64d%I64d%I64d",&n,&r,&k,&m)!=EOF)
        {
            ll tepx=n-(r-1)*k-1,tepy=r+1;
            if (m>r) m=r;
            if (tepx<0)
            {
                printf("0
    ");
                continue;
            }
            ll ans1=f[tepx][tepy];  
            ll ans=0;
    
            ll tep=g[r][m];
            ans=(ans1*tep)%M;
    
            cout<<ans<<endl;
        }
        return 0;
    }
    如有转载,请注明出处(http://www.cnblogs.com/lochan)
  • 相关阅读:
    开发工具IDEA
    了解java 的一角
    枚举类和Random
    字符串String和StringBuffer进行字符串拼接的发现
    java里的包装类
    String和StringBuffer的区别
    StringBuffer进行字符串拼接
    Hashmat
    第三单元作业总结
    第二单元作业总结
  • 原文地址:https://www.cnblogs.com/lochan/p/3437921.html
Copyright © 2011-2022 走看看