关于一种计数的讨论、ARC212C Solution

在 Print 之前

ARC212C 中,我们遇到了一种形如:

已知:

\sum _{i=0} ^{n} x_i=ki=0∑n​xi​=k

求所有:

\prod _{i=0} ^{n} x_ii=0∏n​xi​

的和的题,这引发我们对组合数学的进一步思考。

原式化简

我们可以注意到,如果想要 \prod _{i=0} ^{n} x_i∏i=0n​xi​ 产生贡献,那么 \forall x_i∀xi​ 都不能为 0 。

由此我们可以将题面转化一下,可以理解为将 kk 个球放入 mm 个盒子中,且盒子内不为空,求每个盒子选出一个球的方案数。

可以考虑插板法,我们发现,选出来的 mm 个球与所插 m-1m−1 个板是交替出现的,由此我们可以把它们一起视作板,这样下来就将题目再次转化为了在 k-mk−m 个球中插入 2 \times m-12×m−1 个板。

即原题的答案是:

\binom {k+m-1}{2 \times m-1}(2×m−1k+m−1​)

例题(ARC212C

题目

有白球。首先,你把每个球涂成红色或蓝色。

然后,你把这些 NN 红色或蓝色的彩绘球放在 MM 可区分的盒子里。

设 a_iai​ 和 b_ibi​ 分别为 ii \第1个盒子中红色球和蓝色球的个数。

求出 \prod_{1\leq i \le M}|a_i-b_i|∏1≤i≤M​∣ai​−bi​∣ 对所有放置球的方式取模 998244353998244353 的和。

这里,两种放置球的方法是不同的,当且仅当 a_iai​ 和 b_ibi​ 中至少有一个对于某些 ii 是不同的。

特别是,球彼此之间是无法区分的

Solution

我们发现一种分配的方案产生的贡献是 a_iai​ 和 b_ibi​ 的差的绝对值,所以考虑先从 nn 个球中选出 ii 个球(ii 为偶数),分成 i \div 2i÷2 组,每组为一红一蓝,这些球是不会做出贡献的,那么把它分在 mm 个盒子里的方案数是 \binom {i \div 2 + m-1}{m-1}(m−1i÷2+m−1​)(其实就是插板法)。

剩下 n-in−i 个白色小球要放在 mm 个篮子里面,且在同一篮子里的白色小球颜色一致。

其实就是

已知:

\sum _{i=0} ^{n} x_i=n-ii=0∑n​xi​=n−i

求所有:

\prod _{i=0} ^{n} x_ii=0∏n​xi​

的和。

只不过需注意的是每个篮子中可以有两种染色方案,所以最终答案乘一个 2^m2m 即可。

最终答案就是:

\sum _{i=0}^{n} \binom {i \div 2 + m-1}{m-1} \times \binom {n-i+m-1}{2 \times m-1} \times 2^m \ i \\equiv 0 \\mod 2i=0∑n​(m−1i÷2+m−1​)×(2×m−1n−i+m−1​)×2m i≡0mod2

Code

复制代码

#include <bits/stdc++.h> #define pll pair<ll,ll> #define pld pair<ld,ld> typedef long long ll; typedef long double ld; typedef int praise_long_long; namespace io { using namespace std; inline ll read () { char x=getchar(); ll ans=0,f=1; while (x<'0'||x>'9') { if (x=='-') { f*=(-1); } x=getchar(); } while (x>='0'&&x<='9') { ans*=10; ans+=(x-'0'); x=getchar(); } return ans*f; } void print (ll x) { if (x<0) { x=-x; putchar('-'); } if (x>=10) { print(x/10); } putchar(x%10+'0'); } } using namespace io; const ll N=2e7+5,mod=998244353,inf=2e18; const ld eps=1e-6; ll n,m,sum[N],inv[N],ans; inline void init () { inv[0]=inv[1]=1; for (ll i=2;i<=N-5;i++) { inv[i]=(mod-mod/i)*inv[mod%i]%mod; } sum[0]=1; for (ll i=1;i<=N-5;i++) { inv[i]*=inv[i-1]; sum[i]=sum[i-1]*i; sum[i]%=mod; inv[i]%=mod; } } inline ll C (ll x,ll y) { if (x<y||y<0) { return 0; } return sum[x]*inv[y]%mod*inv[x-y]%mod; } inline ll qpow (ll x,ll y) { ll cnt=1; while (y) { if (y&1) { cnt*=x; cnt%=mod; } x*=x; x%=mod; y>>=1; } return cnt; } inline void solve () { n=read(),m=read(); for (ll i=0;i<=n;i+=2) { ll num=n-i; ans+=C((i>>1)+m-1,m-1)%mod*C(num+m-1,m*2-1)%mod; ans%=mod; } print(ans*qpow(2,m)%mod); } praise_long_long main () { // freopen(".in","r",stdin); // freopen(".out","w",stdout); ll T=1; // T=read(); init(); while (T--) { solve(); } return 0; } /**/

相关推荐
数模竞赛Paid answer4 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆5 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
想吃火锅10056 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
Nil2087 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
依然鸣8 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
qeen8710 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI11 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶11 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机12 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
Nil20813 小时前
leetcode 189轮转数组
数据结构·算法·leetcode