ARC134C The Majority

ARC134C The Majority

link:【ARC134C】 The Majority

小清新数学题。(反正我做不出来)

简要题意

K个箱子,编号为1K的箱子。起初,所有箱子都是空的。

史努克有一些球,球上写着1N的整数。在这些球中,有ai个球上写着数字i。带有相同数字的球无法区分。

史努克决定把他所有的球都放进箱子里。他希望每个箱子里写着数字1的球都是多数。换句话说,每个箱子里,写着数字1的球的数量应该多于其他球的数量,即占到一半以上。

找出这样放置球的方法数,结果对998244353取模。

当存在一对整数(i,j)满足1iK,1jN,并且在第i个箱子中,写着数字j的球的数量不同时,两种方式被认为是不同的。

思路

把每个 1 号球先和每个不是 1 号球配对一下,再在每个盒子里都放 1 个 1 号球。

这样子剩下了 a1i=2naik 个 1 号球。

同时保证了 1 号球是多数的条件。

现在使 a1i=2naika1

接下来球都可以任意放,对于单个种类的球看做有 ai 个球,放到 k 个盒子里,允许空放的问题。

这个经典问题的答案是 Cai+k1k1

最终答案是

i=1nCai+k1k1

CODE

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define mod 998244353

const int maxn=1e5+5;

ll n,k,sum,ans;
ll a[maxn],fac[maxn],inv[maxn];

ll ksm(ll x,ll y)
{
    ll sum=1;
    for(;y;y/=2,x=x*x%mod) if(y&1) sum=sum*x%mod;
    return sum;
}
ll C(ll n,ll m)
{
    if(n<=m) return 1;
    ll sum=inv[m];
    for(ll i=n-m+1;i<=n;i++) sum=sum*i%mod;
    return sum;
}

int main()
{
    scanf("%lld%lld",&n,&k);

    fac[0]=1;
    for(int i=1;i<=k;i++) fac[i]=fac[i-1]*i%mod;
    inv[k]=ksm(fac[k],mod-2);
    for(int i=k-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;

    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=2;i<=n;i++) sum+=a[i];

    a[1]=a[1]-sum-k;
    if(a[1]<0)
    {
        printf("0");
        return 0;
    }

    ans=1;
    for(int i=1;i<=n;i++)
        ans=ans*C(a[i]+k-1,k-1)%mod;
    printf("%lld",ans);
}
posted @   彬彬冰激凌  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示