这道题就不讲每一档部分分怎么拿了,因为我考试的时候也没想。
我们发现如果$k=1$直接输出No就行了,先特判一下。
我们先不妨设$(p_1,p_2)=1$,因为如果$(p_1, p_2) eq 1$,同时对$p_1, p_2$除以$(p_1, p_2)$效果不变。
再不妨设$p_1<p_2$,最坏情况就是在$[qp_2 + 1, (q+1)p_2 - 1]$里大于等于$k$个$p_1$。
而最坏情况就是$qp_2+1$是$p_1$的倍数,即$rp_1=qp_2+1$。
而如果要输出No,则$(r+k-1)p_1 leq (q+1)p_2 - 1$,化简的$(k-1)p_1+1<p_2$。
所以若上述式子满足,则输出No,否则输出Yes。
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; ll t, p1, p2, k; ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll read() { ll ret = 0, f = 1; char ch = getchar(); while ('0' > ch || ch > '9'){ if (ch == '-') f = -1; ch = getchar(); } while ('0' <= ch && ch <= '9') { ret = (ret << 1) + (ret << 3) + ch - '0'; ch = getchar(); } return ret * f; } int main() { // freopen("color.in", "r", stdin); // freopen("color.out", "w", stdout); t = read(); while (t--) { p1 = read(); p2 = read(); k = read(); if (k == 1) { puts("No"); continue; } ll g = gcd(p1, p2); p1 /= g; p2 /= g; if (p1 > p2) swap(p1, p2); if (p1 * (k - 1) + 1 < p2) puts("No"); else puts("Yes"); } return 0; }
不加快读估计会T。