题意:
判断一个数
n
n
n,能否有至少两种方法将其表示为
n
=
a
1
a
2
.
.
.
a
k
n=a_1a_2...a_k
n=a1a2...ak(
k
>
=
1
k>=1
k>=1),需要满足对每一个
a
i
a_i
ai都有:
a
i
%
d
=
=
0
a_i \% d==0
ai%d==0
and
a
i
%
d
2
!
=
0
a_i\%d^2 != 0
ai%d2!=0
先上代码:
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<math.h>
using namespace std;
typedef long long ll;
bool Judge_prime(int x){
if(x == 1)
return true;
for(int i = 2;i <= x/i;i++){
if(x%i == 0){
return false;
}
}
return true;
}
bool Judge_square(int x){
int sq = sqrt(x);
return sq*sq == x;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,d;
scanf("%d%d",&n,&d);
int k = 0;
while(n%d == 0) {
k++;
n /= d;
}
int p = n;
if(k <= 1){
printf("NO\n");
}
else if(k == 2){
if(Judge_prime(p)){
printf("NO\n");
}
else{
printf("YES\n");
}
}
else if(k == 3){
if(!Judge_prime(p)){
printf("YES\n");
}
else{
if(Judge_prime(d)){
printf("NO\n");
}
else{
if(Judge_square(d) && (ll)p*p == d){
printf("NO\n");
}
else{
printf("YES\n");
}
}
}
}
else{
if(!Judge_prime(p)){
printf("YES\n");
}
else{
if(Judge_prime(d)){
printf("NO\n");
}
else{
printf("YES\n");
}
}
}
}
return 0;
}
思路讲解
考虑将
n
n
n形式化分解为:
n
=
d
k
p
n=d^kp
n=dkp,其中,
p
%
d
!
=
0
p\%d!=0
p%d!=0.
1、当
k
=
0
k = 0
k=0或
k
=
1
k = 1
k=1时,显然不行.
2、当
k
=
2
k = 2
k=2时,即
n
=
d
2
p
n=d^2p
n=d2p,显然,将
p
p
p给其中一个
d
d
d是一种合法方案,接下来探索第2种方案。
·当
p
p
p是素数时,不可行。
·当
p
p
p是合数时,设
p
=
x
y
(
x
,
y
>
1
)
p=xy(x,y>1)
p=xy(x,y>1) ,则
n
=
(
d
x
)
(
d
y
)
n=(dx)(dy)
n=(dx)(dy)又是一种合法方案,可行。
3、当
k
=
3
k=3
k=3时,
n
=
d
d
d
p
n=dddp
n=dddp。
·当
p
p
p是合数时,设
p
=
x
y
p=xy
p=xy,则
n
=
d
(
x
d
)
(
y
d
)
n=d(xd)(yd)
n=d(xd)(yd)又是一种合法方案。
·当
p
p
p是素数时
··当
d
d
d是素数时:不可行;
··当
d
d
d是合数时:
···当
d
d
d是完全平方数且
p
∗
p
=
d
p*p=d
p∗p=d,则不可行;
···否则可以,因为一定可以使得
d
=
x
y
(
x
,
y
>
1
,
x
!
=
y
)
d=xy(x,y>1,x!=y)
d=xy(x,y>1,x!=y),将
(
x
p
)
(xp)
(xp)和
(
y
)
(y)
(y),或者
(
y
p
)
(yp)
(yp)和
(
x
)
(x)
(x)分配给剩下两个
d
d
d,且
d
x
p
dxp
dxp或
d
y
p
dyp
dyp不是
d
2
d^2
d2的倍数。
4、当
k
>
=
4
k>=4
k>=4时
·如果
p
p
p是素数,则看
d
d
d
··如果
d
d
d是素数,则不行;否则可行。
·如果
p
p
p是合数,则可行。
由于 p p p可能为1,这里我们认为在对于 p p p和 d d d的判断上,1是“素数”。