AT snuke21H Snuke Density
首先当 \(\max(a, b) > c\) 时一定无解。
其次当 \(a + b\le c\) 时一定有解,这是因为 \(\binom{a + b}{a}\) 就为整数,\(c\ge a + b\) 所以还会乘更多。
这一个想法启发把 \(\frac{c!}{a!b!}\) 拆成 \(\binom{a + b}{a}\times \frac{c!}{(a + b)!}\) 来看。
考虑先随便选一个质数入手,比如说特殊的 \(2\)。
根据 Kummer 定理,有 \(v_2(\binom{a + b}{a})\) 为 \(a + b\) 在 \(2\) 进制下的进位数。
又因为 \(\lfloor\log_2 \max(a, b) \rfloor\le 36\),所以产生的进位数不会超过 \(36\),所以 \(v_2(\binom{a + b}{a})\le 36\)。
那么就需要 \(v_2((a + b)!) - v_2(c!)\le 36\),就有 \(\sum\limits_{i = 1}^\infty \lfloor\frac{a + b}{2^i}\rfloor - \lfloor\frac{c}{2^i}\rfloor \le 36\)。
因为 \(a + b\ge c\),所以可以知道对于任意 \(i\ge 1\),都有 \(\lfloor\frac{a + b}{c}\rfloor - \lfloor\frac{c}{2^i}\rfloor\ge 0\)。
于是此时肯定满足 \(\lfloor\frac{a + b}{2}\rfloor - \lfloor\frac{c}{2}\rfloor\le 36\),有 \(a + b - c\le 73\)。
又因为 \(\binom{a + b}{a}\) 一定为整数,如果 \(\binom{a + b}{a}\times \frac{c!}{(a + b)!}\) 不为整数,令在质数 \(p\) 时不满足,那肯定有 \(v_p((a + b)!) > v_p(c!)\)。
那么 \(p\) 的倍数 \(kp\) 就一定满足 \(kp\in [c + 1, a + b]\) 中。
又因为 \(a + b - c\le 73\),直接暴力枚举 \(x\in [c + 1, a + b]\),然后对于 \(x\) 的质因子去 check 即可。
时间复杂度 \(\mathcal{O}(\log V(\sqrt{V} + \omega(V)\log V))\)。
其中前面的 \(\log V\) 指的是 \(a + b - c\) 的级别。
#include<bits/stdc++.h>
using ll = long long;
int main() {
ll a, b, c; scanf("%lld%lld%lld", &a, &b, &c);
if (std::max(a, b) > c || a + b - c > 73)
return puts("NO"), 0;
auto count = [&](ll n, ll p) {
ll ans = 0;
while ((n /= p) > 0) ans += n;
return ans;
};
auto check = [&](ll p) {
if (count(c, p) < count(a, p) + count(b, p)) {
puts("NO"); exit(0);
}
};
for (ll _ = c + 1; c <= a + b; c++) {
ll x = _;
for (ll i = 2; i * i <= x; i++)
if (x % i == 0) {
check(i);
while (x % i == 0) x /= i;
}
if (x > 1) check(x);
}
puts("YES");
return 0;
}
浙公网安备 33010602011771号