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;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    Mysql里的isnull(),ifnull(),nullif
    懒加载数据
    MyEclipse编辑xml文件没有提示
    java-五子棋游戏源码
    Java版打字练习游戏源码
    Wpf实现图片自动轮播自定义控件
    WP8.1开发:自定义控件
    简单的UIButton按钮动画效果ios源码下载
    自定义的一款选项卡ios源码
    Aisen微博应用源码完整版
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11625389.html
Copyright © 2011-2022 走看看