hdu 5209 Magic Toy Brick

来源:互联网 发布:中国电网logo知乎 编辑:程序博客网 时间:2024/06/08 18:30

我们先考虑对于一行p个人有多少种图案,首先撇去顺序,我们社xi表示h为i的个数,所以x1+....+xm=p,xi>=0因为大小是确定的所以不用管大小顺序,所以方案数是

C(p+m-1,m-1),所以剩下的就是dp,我们令dp[i]表示砖头数为i的方法数,我们只需考虑第一行假如是j那么dp[i]+=dp[i-j]*C(i-1,j-1)*C(j+m-1,m-1)(因为第一块肯定是第一行,剩下j-1块要从i-1块里选)。

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;const int mod=1000000007;const int maxn=110005;typedef long long LL;LL jie[maxn],jie2[maxn];int mm(int n,int m){    LL s=1,k=n;    while(m>0){        if(m&1){            s=s*k;            s%=mod;        }        k=k*k;        k%=mod;        m>>=1;    }    return s;}int zuhe(int n,int m){    LL s;    s=jie[n];    s=s*jie2[m];    s%=mod;    s=s*jie2[n-m];    s%=mod;    return s;}void init(void){    int i;    jie[0]=1;    jie2[0]=1;    for(i=1;i<=110000;i++){        jie[i]=jie[i-1]*i;        jie[i]%=mod;        jie2[i]=mm(jie[i],mod-2);    }}LL dp[1005];int main(){    int i,j,n,m,t,N=0;    cin>>t;    init();    while(t--){        cin>>n>>m;        memset(dp,0,sizeof(dp));        dp[0]=1;        for(i=1;i<=n;i++){            for(j=1;j<=i;j++){                dp[i]+=zuhe(i-1,j-1)*((dp[i-j]*zuhe(j+m-1,m-1))%mod);                dp[i]%=mod;            }        }        printf("Case #%d: %d\n",++N,dp[n]);    }}


0 0
原创粉丝点击