时间限制:1秒 内存限制:128M
题目描述
给定一个正整数𝑛n,请你把𝑛分解成三个互不相同的大于等于2的整数𝑎,𝑏,𝑐,保证𝑎<𝑏<𝑐,𝑎×𝑏×𝑐=𝑛如果有多解,保证𝑎最小,在𝑎最小的前提下保证𝑏最小。
输入描述
第一行一个正整数𝑇(1≤𝑇≤100),表示有𝑇组输入。
对于每组输入,输入一个正整数𝑛(2≤𝑛≤109),含义如题所示。
输出描述
对于每个𝑛,如果不能按照要求分解,输出NO
,否则,输出YES
,然后换行输出分解出来的三个正整数。
样例输入
5
64
32
97
2
12345
样例输出
YES
2 4 8
NO
NO
NO
YES
3 5 823
思路分析
题目比较直接,挨个求abc即可,因为a*b*c==n,所以a的范围是2-sqrt(n),b比a大,范围是a+1-sqrt(n),c能算不举,等于n/b/c
#include<iostream>
#include<cmath>
using namespace std;
int n,t;
int fun(int i,int n){//查找因数
for(;i*i<=n;i++){
if(n%i==0) return i;
}
return 1;
}
int main(){
cin>>t;
while(t--){
cin>>n;
int a=fun(2,n);
n/=a;
int b=fun(a+1,n);
n/=b;
if(a!=1&&b!=1&&n!=1&&a!=b&&a!=n&&b!=n){
cout<<"YES"<<"\n"<<a<<" "<<b<<" "<<n<<"\n";
}else{
cout<<"NO"<<"\n";
}
}
return 0;
}