D:
https://codeforces.com/contest/1647/problem/D
题意:
给两个数
x
,
d
x , d
x,d。
定义:
d
d
d整除
x
x
x且
d
2
d^2
d2不整除
x
x
x,则称
x
x
x是漂亮数。
问你是否有两种或以上的方法,将x拆成若干个漂亮数的乘积,拆分数集不同即方法不同。
输出
Y
E
S
YES
YES或
N
O
NO
NO
思路:
易知
x
=
d
c
n
t
∗
k
x = d^{cnt} * k
x=dcnt∗k,所以当
c
n
t
≤
1
cnt \leq 1
cnt≤1 输出
N
O
NO
NO
c
n
t
≥
2
:
k
~~~~~~~cnt \geq 2: k
cnt≥2:k为不素数,输出
Y
E
S
YES
YES
k
~~~~~~~~~~~~~~~~~~~~~~~k
k为素数,
d
d
d为素数,输出
N
O
NO
NO
当
c
n
t
≥
2
,
k
cnt \geq 2~,k
cnt≥2 ,k为素数,
d
d
d不为素数时:
考虑当
c
n
t
=
2
cnt = 2
cnt=2时:
x
=
d
∗
(
k
∗
d
)
x = d*(k*d)
x=d∗(k∗d),只有一种,输出
N
O
NO
NO。
当
c
n
t
=
3
cnt = 3
cnt=3时,
x
=
d
∗
d
∗
(
k
∗
d
)
,
d
x = d*d*(k*d) ,d
x=d∗d∗(k∗d),d可再分,但是当
k
∗
k
=
d
k*k=d
k∗k=d时,就只有一种情况了,反之多种,故这里需要再次分类讨论。
当
c
n
t
=
4
cnt = 4
cnt=4时,
x
=
d
∗
d
∗
d
∗
(
k
∗
d
)
x = d*d*d*(k*d)
x=d∗d∗d∗(k∗d),当
k
∗
k
=
d
k*k=d
k∗k=d时,可以表示为
x
=
d
∗
d
∗
d
∗
(
k
∗
d
)
=
(
k
∗
d
)
∗
(
k
∗
d
)
∗
(
k
∗
d
)
x = d*d*d*(k*d) = (k*d)*(k*d)*(k*d)
x=d∗d∗d∗(k∗d)=(k∗d)∗(k∗d)∗(k∗d)两种方案,输出
Y
E
S
YES
YES 。
当
c
n
t
>
4
cnt > 4
cnt>4时,情况与
c
n
t
=
4
cnt = 4
cnt=4一致。
#include <bits/stdc++.h>
#include <algorithm>
using namespace std ;
#pragma GCC optimize(2)
typedef long long ll ;
const int maxn = 1e6+100 ;
bool prime(int x){
int k = sqrt(x) ;
for(int i=2;i<=k;++i){
if(x%i==0) return 0 ;
}
return 1 ;
}
void solve(){
int T ;
cin >> T ;
while(T--){
int n , d , cnt = 0;
cin >> n >> d ;
while(n%d==0) n /= d , cnt++ ;
if(cnt<2){
cout << "NO\n" ;
continue ;
}
if(!prime(n)){
cout << "YES\n" ;
continue ;
}
if(prime(d)){
cout << "NO\n" ;
continue ;
}
if(cnt>=4){
cout << "YES\n" ;
continue ;
}
if(cnt==2){
cout << "NO\n" ;
continue ;
}
if(n*n==d){
cout << "NO\n" ;
continue ;
}
cout << "YES\n" ;
}
}
int main() {
ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;
solve() ;
return 0 ;
}