AT2642 [ARC076A] Reconciled? 题解
Content
有 \(n\) 只狗和 \(m\) 只猴,现在要把这 \(n+m\) 只动物排成一排,要求相邻两只动物不能同时是狗或者同时是猴。求排列方案总数对 \(10^9+7\) 取模后的值。
数据范围:\(1\leqslant n,m\leqslant 10^5\)。
Solution
首先不难想到,如果 \(|n-m|>1\),那么必然没有方案能够满足要求。
否则,如果 \(n=m\),那么要么是 狗猴狗猴…… 这种排列,要么是 猴狗猴狗…… 这种排列,又由于每种动物的排列总数都是 \(n!\),因此依据乘法原理可知答案就是 \(2(n!)^2\)。
否则就是 \(|n-m|=1\) 的情况了,我们不妨先放数量少的动物,这样会形成 \(\min\{n,m\}+1\) 个空位,然后直接把剩下那种动物随便放进去每个空位即可。依据乘法原理可知答案就是 \(n!\times m!\)。
那么这道题目就写完了。
Code
namespace Solution {
#define int ll
const int mod = 1e9 + 7, N = 1e5 + 7;
int a, b, fac[N];
iv Main() {
read(a, b), fac[0] = 1;
F(int, i, 1, max(a, b)) fac[i] = fac[i - 1] * i % mod;
if(abs(a - b) > 1) return write(0);
if(a == b) write(2ll * fac[a] % mod * fac[a] % mod);
else write(fac[b] * fac[a] % mod);
return;
}
#undef int
}

浙公网安备 33010602011771号