定义

任何一个大于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++;
}

题目

批注 20200206 212529.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;
}



hhhhh