C. Product of Three Numbers
题目大意:
意思很简单,给出一个数n,找到三个不同的且大于2 的数使得三个数之积为n。
思路:
首先进行分解质因数,将所得答案放入vector中,通过判断vector的大小来分情况,若大于3那肯定输出yes,输出前两个数对应的快速幂之后的值,再将剩余的累乘输出即可。当小于3时,我们需要对size为1和2时进行判断,显然为1时,如果该数的幂次大于6才能输出yes,否则输出no,当size为2时,如果两个因数的幂次和大于等于4时才能输出yes,否则输出no。
#include<iostream>
#include<stack>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int p = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e6+10;
map<ll, int>mp;
vector<pii>v;
ll a[N];
void divide(ll x)
{
for (int i = 2; i <= x / i; i++)
if (x % i == 0)
{
int s = 0;
while (x % i == 0) x /= i, s++;
v.push_back({ i,s });
}
if (x > 1) v.push_back({ x,1 });
}
unsigned long long qmi(ll m, ll k)
{
unsigned long long res = 1, t = m;
while (k)
{
if (k & 1) res = res * t;
t = t * t;
k >>= 1;
}
return res;
}
int main() {
int t;
cin >> t;
while (t --)
{
v.clear();
ll n;
cin >> n;
divide(n);
vector<pii>::iterator it;
int cnt = 0;
if (v.size() < 3) {
int flag = 0;
if (v.size() == 1) {
for (it = v.begin(); it != v.end(); it++) {
if (it->second < 6) {
puts("NO");
break;
}
else {
puts("YES");
cout << it->first << ' ' << it->first * 2 << ' ' << qmi(it->first, it->second - 3) << endl;
}
}
}
else {
int cnt1 = 0, cnt2 = 0, cnt3=0, cnt4=0;
for (it = v.begin(); it != v.end(); it++) {
cnt1 += it->second;
}
if (cnt1 < 4) {
puts("NO");
}
else {
puts("YES");
for (it = v.begin(); it != v.end(); it++) {
if (cnt == 0) {
cout << it->first << ' ';
cnt1 = it->second - 1;
cnt3 = it->first;
cnt++;
}
else {
cout << it->first << ' ';
cnt2 = it->second - 1;
cnt4 = it->first;
cnt++;
}
}
if (cnt1 == 0) {
cout << qmi(cnt4, cnt2) << endl;
}
else if (cnt2 == 0) {
cout << qmi(cnt3, cnt1) << endl;
}
else {
cout << qmi(cnt3, cnt1) * qmi(cnt4, cnt2) << endl;
}
}
}
}
else {
puts("YES");
for (it = v.begin(); it != v.end(); it++) {
if (cnt != 2) {
if (it->second == 1) {
cout << it->first << ' ';
cnt++;
}
else {
cout << qmi(it->first, it->second) << ' ';
cnt++;
}
}
else {
vector<pii>::iterator i;
unsigned long long ans = 1;
for (i = it; i != v.end(); i++) {
ans *= qmi(i->first, i->second);
}
cout << ans << endl;
break;
}
}
}
}
}