/* C(n,k)和素数P的问题 公式: 求C(n,k)中素因子P的个数: 1.把n转化为P进制,并记它每个位上的和为S1 2.把n-k,k做同样的处理,得到S2,S3 则C(n,k)中素因子P的个数: (S2+S3-S1)/(P-1) */ #include <iostream> #include <cstdio> #include <cstring> #include <bitset> #include <cmath> using namespace std; const int N = 1000005; int prime[N]; bitset<N> hash; //bool hash[N]; int xi; void Prime() { //hash.reset(); //memset(hash, false, sizeof(hash)); int temp = (int) sqrt(N * 1.0); for (int i = 2; i <= temp; i++) if (!hash[i]) for (int j = i + i; j < N; j += i) hash[j] = 1; xi = 0; for (int i = 2; i < N; i++) if(!hash[i]) prime[xi++] = i; // printf("%d ", xi); } void Fun(int n, int pp, int &s) { s = 0; while (n) { s += n % pp; n /= pp; } } int main() { int t; Prime(); scanf("%d", &t); while (t--) { int n, m, p; scanf("%d %d %d", &n, &m, &p); int nn = n; int mm = m; int pp = p; bool flag = false; int s1, s2, s3; int sum; for (int i = 0; i < xi && prime[i] <= p; i++) { if (p % prime[i] == 0) { sum = 1; p /= prime[i]; while (p % prime[i] == 0) { sum++; p /= prime[i]; } Fun(n, prime[i], s1); Fun(n - m, prime[i], s2); Fun(m, prime[i], s3); if (((s2 + s3 - s1) / (prime[i] - 1)) < sum) { flag = true; break; } } } if (p != 1 && !flag) { sum = 1; Fun(n, p, s1); Fun(n - m, p , s2); Fun(m, p , s3); if (((s2 + s3 - s1) / (p - 1)) < sum) { flag = true; } } if(flag) puts("No"); else puts("Yes"); } }