题面
给定n,m,k
,求不定方程:
i=1∑mxi=k (xi∈Z,0≤xi<n)
的解的个数。
数据范围:
1≤n,m≤105
0≤k≤105
所有数据n,m,k
之和不会超过 5×106
。
题目链接
分析
首先,如果题目没有给出xi<n
这一限制,我们可以用隔板法(参考 HDUOJ 3037 - Saving Beans)求出解的种数:
(m−1k+m−1)
但是现在我们有xi<n
这一限制条件,因此我们需要把存在 xi≥n
的解剔除掉。我们考虑使用容斥原理。
为了方便叙述,我们以m=3
的情况为例,画出如下韦恩图:
韦恩图
我们所要求的就是x1,x2,x3<n
的部分(即上图中的 S0
)。
我们先用容斥原理求出存在xi
不满足上限的全集的大小(即 ∣S1∪S2∪S3∣
):
∣i=1⋃3Si∣=(∣S1∣+∣S2∣+∣S3∣)−(∣S1∪S2∣+∣S1∪S3∣+∣S2∪S3∣)+∣S1∪S2∪S3∣=i=1∑3∣Si∣−1≤i<j≤3∑∣Si∪Sj∣+1≤i<j<k≤3∑∣Si∪Sj∪Sk∣
那么我们所要求的答案就是所有方案数减去存在xi
不满足上限的方案数:
∣S0∣=∣S0∪S1∪S2∪S3∣−∣S1∪S2∪S3∣
我们可以轻松从m=3
推广到 m
为任意值的情况:
∣S0∣=∣i=0⋃mSi∣−∣i=1⋃mSi∣=(m−1k+m−1)−[i=1∑m∣Si∣−1≤i<j≤m∑∣Si∪Sj∣+⋯+(−1)m+1∣S1∪⋯∪Sm∣]
接下来我们需要使用组合数学的相关知识把上述公式中的每一项表示出来。
记F(p)
代表从 m
个 xi
中选取 p
个来违反上界限制的种数,那么上述公式可改写为:
∣S0∣=(m−1k+m−1)−[F(1)−F(2)+⋯+(−1)m+1F(m)]=(m−1k+m−1)+i=1∑m(−1)i⋅F(i)
我们来思考如何表示出F(i)
。记选出违反上界限制的 p
个未知量为 x1,x2,…xp
,则:
x1+x2+⋯+xm⇒(x1−n)+(x2−n)+⋯+(xp−n)+xp+1+⋯+xm=k=k−p⋅n
由此一来我们选出的p
个不违反上界限制的变量都保证满足上界限制了(当然未选出的变量仍有可能违反上界限制)。套用本文开头所述的公式得解的组数为:(m−1k−p⋅n+m−1)
,而在 m
个 xi
中任选 p
个的方案为 (pm)
, 由乘法原理得:
F(p)=(pm)⋅(m−1k−p⋅n+m−1)
我们将其带入上面我们得到的公式就可以求得解了。
实现
完整参考代码