定义
任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1 P2^a2 P3^a3 …Pn^an,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。
模板
struct Node {
int p;
int ci;
} a[70] = {0};
int j;
void fenjie(int n) {
j = 0;
int k = sqrt(n);//这里可能有问题
for (int i = 2; i <= k; i++) {
if (n % i == 0) { //n有因子i
a[j].p = i;
while (n % i == 0) //统计i的次数
a[j].ci++, n /= i;
j++;
}
}
if (n > k) //n的大于根号k的因子只有1个
a[j].p = n, a[j].ci = 1, j++;
}
题目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQOF8Kew-1583633386662)(http://106.15.192.117:233/upload/2020/2/%E6%89%B9%E6%B3%A8%202020-02-06%20212529-3e27d50ad56447139794f3eb7ea71f66.jpg)]
input:
5
64
32
97
2
12345
output:
YES
2 4 8
NO
NO
NO
YES
3 5 823
- 代码
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include <vector>
#include <cctype>
#include <cstdlib>
using namespace std;
#define ll long long
#define il inline
#define oo 2147000000
#define sc(x) scanf("%d",&x)
#define scc(x, y) scanf("%d%d",&x,&y)
#define sccc(x, y, z) scanf("%d%d%d",&x,&y,&z)
#define p(x) printf("%d\n",x)
#define m(x, y) (x+y)>>1
#define l(x) x<<1
#define r(x) x<<1|1
const int maxn = 1e5 + 6;
vector<int> v;
int main() {
int n,t;
sc(n);
while (n--) {
v.clear();
sc(t);
for (int i = 2; i <= sqrt(t); i++) {//sqrt(t)很重要
if (t % i == 0) {
v.push_back(i);
t /= i;
}
if (v.size() == 2)
break;
}
if (v.size() == 2) {
v.push_back(t);
if (v[1] != v[2] && v[0] != v[1]) {
printf("%s\n", "YES");
printf("%d %d %d\n", v[0], v[1], v[2]);
} else
printf("%s\n", "NO");
} else
printf("%s\n", "NO");
}
return 0;
}