zoukankan      html  css  js  c++  java
  • Codeforces Round #589 (Div. 2)E(组合数,容斥原理,更高复杂度做法为DP)

    #define HAVE_STRUCT_TIMESPEC
    #include<bits/stdc++.h>
    using namespace std;
    int f[257],fac[257],ifac[257];
    const long long mod = 1e9+7;
    int qpow(int x,int y){
    int tamp=1;
    while(y){
    if(y&1)
    tamp=1ll*tamp*x%mod;
    x=1ll*x*x%mod;
    y>>=1;
    }
    return tamp;
    }
    int combination(int n,int m){
    return 1ll*ifac[m]*ifac[n-m]%mod*fac[n]%mod;//n!/(m!*(n-m)!)
    }
    int main(){
    int n,k;
    cin>>n>>k;
    fac[0]=1;
    for(int i=1;i<=n;++i){
    f[i]=qpow((qpow(k,i)-qpow(k-1,i)+mod)%mod,n);//f[i]表示有i列格子填上了数字,每一列都有1
    //qpow(k,i)表示一列中每一格都用1~k填充,即全排列
    //qpow(k-1,i)表示一列中每一格都用2~k填充,即这一列没有1
    //相减得到这一列定有1,n次方表示n列每一列都定有1
    fac[i]=1ll*fac[i-1]*i%mod;//fac[i]表示sum[1,i](f[i])
    }
    ifac[n]=qpow(fac[n],mod-2);//费马小定理求逆元
    for(int i=n-1;i>=0;--i)
    ifac[i]=1ll*ifac[i+1]*(i+1)%mod;//ifac[i]=1/((n!*(n-i)!)/n!)
    int ans=0;
    for(int i=0;i<=n;++i)
    ans=(ans+((i&1)?mod-1ll:1ll)*combination(n,i)%mod*qpow(k-1,1ll*n*i)%mod*f[n-i]%mod)%mod;
    //容斥,用全排列的情况减去只有1列没有1加上只有2列没有1减去只有3列没有1加上只有4列没有1......
    //多集合取交集容斥问题,公式类似二项式定理即ans=sum[0,n]((-1)^i*(C(n,i)(k-1)^(n*i))*f[n-i])
    cout<<ans<<endl;
    return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    NOIP2014D2T2寻找道路(Spfa)
    【割点】【割边】tarjan
    NOIP2013D1T3货车运输(最大生成树+倍增lca)
    lca最近公共祖先(模板)
    人生第一次hash
    【模板】Tarjan求强连通分量
    【模板】链式前向星+spfa
    二叉树的三种遍历
    hdu 3549 最大流
    hdu 1532&&poj1273 基础最大流
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11625389.html
Copyright © 2011-2022 走看看