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;
}
posted @ 2024-08-20 10:04  rizynvu  阅读(28)  评论(0)    收藏  举报