BZOJ 4559: [JLoi2016]成绩比较 容斥+组合

很不错的一道数数题. 

code: 

#include <cstdio> 
#include <algorithm>  
#define N 203  
#define ll long long 
#define mod 1000000007
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;
int n,m,kth; 
int ui[N],ri[N],f[N],g[N][N],h[N][N],fac[N],inv[N];  
int qpow(int x,int y) 
{
    int tmp=1; 
    for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod;  
    return tmp; 
}
int INV(int x) { return qpow(x,mod-2); }           
void Initialize() 
{ 
    int i,j; 
    fac[0]=inv[0]=1; 
    for(i=1;i<N;++i) fac[i]=(ll)fac[i-1]*i%mod,inv[i]=INV(fac[i]);    
}   
int C(int x,int y) 
{
    if(x<0||y<0||x<y) return 0; 
    return (ll)fac[x]*inv[y]%mod*inv[x-y]%mod; 
}
int main() 
{ 
    int i,j,ans=0; 
    // setIO("input");   
    Initialize(); 
    scanf("%d%d%d",&n,&m,&kth);   
    for(i=1;i<=m;++i) scanf("%d",&ui[i]); 
    for(i=1;i<=m;++i) scanf("%d",&ri[i]);     
    for(i=0;i<n;++i) 
    {    
        f[i]=C(n-1,i);     
        for(j=1;j<=m;++j) f[i]=1ll*f[i]*C(n-1-i,ri[j]-1)%mod;           
    }             
    for(i=kth;i<=n-kth-1;++i) 
    {
        (ans+=1ll*((i-kth)%2==0?1:mod-1)*f[i]%mod*C(i,kth)%mod)%=mod;         
    } 
    for(i=1;i<=m;++i) 
    {
        for(j=1;j<=min(n,ui[i]);++j)     
        {          
            for(int k=1;k<=j;++k)        
            {
                (g[i][j]+=(ll)qpow(k,n-ri[i])*qpow(j-k,ri[i]-1)%mod)%=mod;     
            }      
        }
    }            
    for(i=1;i<=m;++i) 
    {    
        int re=0,tmp=ui[i],fa=1;    
        for(j=1;j<=min(n,ui[i]);++j) 
        {
            h[i][j]=g[i][j];                             
            for(int k=1;k<=j-1;++k)            
            {
                (h[i][j]+=mod-((ll)h[i][k]*C(j,k)%mod))%=mod;   
            }
            fa=(ll)fa*tmp%mod*INV(j)%mod;               
            (re+=(ll)fa*h[i][j]%mod)%=mod;    
            --tmp;    
        }           
        ans=(ll)ans*re%mod;   
    }
    printf("%d\n",ans);  
    return 0;
}

  

上一篇:P6475 [NOI Online #2 入门组]建设城市 |组合数学


下一篇:线性递推阶乘的逆元