zoukankan      html  css  js  c++  java
  • Codeforces

    https://codeforces.com/problemset/problem/1081/C

    这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况。

     $k=0$ 就是全部同色, $k=1$ 就是左边一个色右边一个色, $m(m-1)$ ,再选转折点有 $i-1$ 种 $C_{i-1}^{1} $( $i$ 个球。 $i-1$ 个空挡都可以插)。

    到 $k=2$ 呢?可以是三种不同颜色,也可以是左右左,也就是 $m(m-1)(m-1)$ ,再选转折点有 $C_{i-1}^{2}$ 。

    到k=3呢?更复杂了? $m(m-1)(m-1)(m-1)$ ,中间的用隔板法算,也就是 $C_{i-1}^{3}$ ?

    所以答案其实就是 $m(m-1)^kC_{n-1}^k$ ,是组合数学?

    隔板法就是:(可以为空的情况)给每组默认加上一个小球,然后隔板就可以选所有球的间隔。(不能为空的情况:)选所有球的间隔

    ll qpow(ll x,ll n){
        ll res=1;
        while(n){
            if(n&1)
                res=res*x%p;
            x=x*x%p;
            n>>=1;
        }
        return res;
    }
    
    void init(int n){
        fac[0]=1;
        for(int i=1;i<=n;i++){
            fac[i]=fac[i-1]*i%p;
        }
        invfac[n]=qpow(fac[n],p-2);
        //费马小定理
        for(int i=n;i>=1;i--){
            invfac[i-1]=invfac[i]*i%p;
        }
        //线性求阶乘逆元
    }
    
    ll C(int n,int m){
        return fac[n]*invfac[n-m]%p*invfac[m]%p;
    }

    dp解法: $f[i][j]=f[i-1][j]+f[i-1][j-1]$ ,以位置 $i$ 为结尾的,有j次转折,分在此转折和跟随左侧颜色两种情况

    好不容易抄了一个线性求 $invfac$ ,居然费马小定理的时候传入一个 $n$ 而不是 $fac[n]$ ,我是服气了的,最后还忘记把 $2$ 改成 $k$ ,我大概是智障吧。 

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    
    ll dp[2005][2005]={}; //dp[i][k]以i为结尾的,有k块砖与左边的颜色不一样
    ll p=998244353;
    
    ll pow_mm1[2005];
    ll fac[2005];
    ll invfac[2005];
    
    ll qpow(ll x,ll n){
        ll res=1;
        while(n){
            if(n&1)
                res=res*x%p;
            x=x*x%p;
            n>>=1;
        }
        return res;
    }
    
    void init(int n){
        fac[0]=1;
        for(int i=1;i<=n;i++){
            fac[i]=fac[i-1]*i%p;
        }
        invfac[n]=qpow(fac[n],p-2);
        //费马小定理
        for(int i=n;i>=1;i--){
            invfac[i-1]=invfac[i]*i%p;
        }
        //线性求阶乘逆元
    }
    
    ll C(int n,int m){
        return fac[n]*invfac[n-m]%p*invfac[m]%p;
    }
    
    
    int n,m,k;
    int main(){
        init(2000);
    
        pow_mm1[0]=1;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=2000;i++){
            pow_mm1[i]=pow_mm1[i-1]*(m-1)%p;
        }
    
        /*for(int i=1;i<=n;i++){
            dp[i][0]=m;
            //都是同一种颜色
        }
    
        for(int i=1;i<=n;i++){
            dp[i][1]=m*(m-1)%p*(i-1)%p;
            //左边的至少一块砖其中一种颜色,右边的另一种颜色,左边有1~i-1块砖
            for(int k=2;k<=i-1;k++){
                dp[i][k]=(m*pow_mm1[k])%p*C(i-1,k)%p;
            }
        }
        */
    
        //dp[i][k]=(m*pow_mm1[k])%p*C(i-1,k)%p;
        printf("%lld
    ",(m*pow_mm1[k])%p*C(n-1,k)%p);
    
    }

    拓展阅读:组合数学的水题?https://www.cnblogs.com/kuangbin/archive/2012/08/28/2661066.html

     2019-01-16

  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/Yinku/p/10279501.html
Copyright © 2011-2022 走看看