思路
前置题:https://www.acwing.com/problem/content/1310/
不等式
1≤a1+a2+⋯+am≤n,ai∈[0,n]
的解与以下方程的解一一对应:
a1+a2+⋯+am+am+1=n,∀i∈[1,m],ai∈[0,n],am+1∈[0,n−1]
即对于任意一组不等式解 a1+a2+⋯+am=k∈[1,n],令 am+1=n−k∈[0,n−1] 就得到一组方程的解。反之,任意一组方程的解,去掉 am+1 就变为一组不等式的解。
若 am+1=n,则上述方程只有一组解,即 a1,a2,⋯,am=0,am+1=n。
若 ∀i∈[1,m+1],ai∈[0,n],令 bi=ai+1∈[1,n+1],则以下方程的解与原方程的解一一对应:
b1+b2+⋯+bm+bm+1=n+m+1
而上述方程解的个数可用隔板法(见前置题或本文末尾的例题)求出,为 Cmn+m。
因此答案是 Cmn+m,减去 am+1=n 时的一组解。
MOD = int(1e6) + 3
def mpow(a, n, m):
r = 1 % m
while n:
if n & 1: r = r * a % m
a = a * a % m
n >>= 1
return r
def C(n, m):
res = 1
for i, j in zip(range(n, -1, -1), range(1, m + 1)):
res = res * i * mpow(j, MOD - 2, MOD) % MOD
return res
n, m = map(int, input().split())
print((C(n + m, m) - 1 + MOD) % MOD)
隔板法
太强了orz
为什么要将 “a1+a2+⋯+am+am+1=n” 转化为 “b1+b2+⋯+bm+bm+1=n+m+1” ?
方便放隔板
好的谢谢
因为a1 + a2+a3+..am+ 1 = n,那我Cn-1,m是不是也可以哦?
不行,要转换成至少放一个。
明白哩
美琴不仅人长得美,写得题解也很美