2021 ICPC-济南站 Problem C. Optimal Strategy

题目:

思路分析:

可以手动模拟一下过程 

 

代码实现:

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
 *                                                     __----~~~~~~~~~~~------___
 *                                    .  .   ~~//====......          __--~ ~~
 *                    -.            \_|//     |||\\  ~~~~~~::::... /~
 *                 ___-==_       _-~o~  \/    |||  \\            _/~~-
 *         __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *     _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *   .~       .~       |   \\ -_    /  /-   /   ||      \   /
 *  /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 *  |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *           '         ~-|      /|    |-~\~~       __--~~
 *                       |-~~-_/ |    |   ~\_   _-~            /\
 *                            /  \     \__   \/~                \__
 *                        _--~ _/ | .-~~____--~-/                  ~~==.
 *                       ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                  -_     ~\      ~~---l__i__i__i--~~_/
 *                                  _-~-__   ~)  \--______________--~~
 *                                //.-~~~-~_--~- |-------~~~~~~~~
 *                                       //.-~~~--\
 *                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *                               神兽保佑            永无BUG
 */


//--组合数学--
const int Cmod = 998244353;
ll fac[1000100],inv[1000100];
int power(int a,int b)
{
    int ret;
    if (b==0) return 1;
    ret=power(a,b/2);
    ret=1ll*ret*ret%Cmod;
    if (b%2)ret=1ll*ret*a%Cmod;
    return ret;
}
void pre(){
    fac[0]=1;inv[0]=1;
    for(int i=1;i<=1000000;i++)
    {
        fac[i]=1ll*fac[i-1]*i%Cmod;
        inv[i]=power(fac[i],Cmod-2);
    }
}
int C(int n,int m) //组合数的计算
{
    if (n<m) return 0;
    if (n<0||m<0) return 0;
    return 1ll*fac[n]*inv[m]%Cmod*inv[n-m]%Cmod;
}
//----------

const int MAX=1e6+10;
int cnt[MAX];
int f[MAX];
int sum[MAX];
void solve(){
    int n;
    cin>>n;
    int flag=0;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        cnt[x]++;
    }
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]+cnt[i];
    }
    for(int i=1;i<=n;i++){
        if(!cnt[i]){
            f[i]=f[i-1];
            continue;
        }
        if(!flag){
            flag=1;
            f[i]=1;
            for(int j=2;j<=cnt[i];j++){
                f[i]=(f[i]*j)%Cmod;
            }
            continue;
        }
        f[i]=f[i-1]*C(sum[i-1]+cnt[i]/2,cnt[i]/2)%Cmod;
        for(int j=2;j<=cnt[i];j++){
            f[i]=(f[i]*j)%Cmod;
        }
    }
    cout<<f[n]<<endl;
}
int n;
int main(){
    pre();
    solve();
}

猜你喜欢

转载自blog.csdn.net/m0_57006708/article/details/121364737