C. Product of Three Numbers
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given one integer number n
. Find three distinct integers a,b,c such that 2≤a,b,c and a⋅b⋅c=n
or say that it is impossible to do it.
If there are several answers, you can print any.
You have to answer t
independent test cases.
Input
The first line of the input contains one integer t
(1≤t≤100
) — the number of test cases.
The next n
lines describe test cases. The i-th test case is given on a new line as one integer n (2≤n≤109
).
Output
For each test case, print the answer on it. Print “NO” if it is impossible to represent n
as a⋅b⋅c for some distinct integers a,b,c such that 2≤a,b,c
.
Otherwise, print “YES” and any possible such representation.
Example
Input
Copy
5
64
32
97
2
12345
Output
Copy
YES
2 4 8
NO
NO
NO
YES
3 5 823
判断三个数互不相等
ix != iy && iy != iz && ix != iz
刚开始最后一个判断没加上, wa了一发。吃一堑长一智。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int a[10000];
void solve() {
memset(a, 0, sizeof(a));
int n, tot = 0;
cin >> n;
int mx = sqrt(n);
for(int i = 2; i <= mx; i++) {
while(n % i == 0) {
n /= i;
a[tot++] = i;
}
}
if(n > 1)
a[tot++] = n;
// for(int i = 0; i < tot; i++)
// cout << a[i] <<" ";
// cout << endl;
int ix = 1, iy = 1, iz = 1;
if(tot < 3) {
cout << "NO" << endl;
return;
}
if(tot == 3) {
if(a[0] != a[1] && a[1] != a[2] && a[0] != a[2]) {
cout << "YES" << endl;
cout << a[0] << " " << a[1] << " " << a[2] << endl;
return;
}
else {
cout << "NO" << endl;
return;
}
}
ix = a[0], iy = a[1];
int i = 1;
if(ix == iy) {
i = 3;
iy *= a[2];
}
else
i = 2;
for(; i < tot; i++) {
iz *= a[i];
}
if(ix != iy && iy != iz && ix != iz) {
cout << "YES" << endl;
cout << ix << " " << iy << " " << iz << endl;
return;
}
else {
cout << "NO" << endl;
return;
}
}
int main() {
int t;
cin >> t;
while(t--)
solve();
return 0;
}