复杂度:O(n^1/4)
链接:https://blog.csdn.net/water_zero_saber/article/details/79901588
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;typedef long long ll;
const int maxn = 105;
ll x[maxn], ans;
queue<ll> aria;
ll min(ll a, ll b)
{
if(a < b) return a;else return b;
}
ll multi(ll a, ll b, ll p) //快速乘?
{
ll ans = 0;while(b){
if(b & 1LL) ans = (ans+a)%p;a = (a+a)%p;b >>= 1;}return ans;
}
ll qpow(ll a, ll b, ll p)
{
ll ans = 1;while(b){
if(b & 1LL) ans = multi(ans, a, p);a = multi(a, a, p);b >>= 1;}return ans;
}bool MR(ll n)
{
if(n == 2) return true;int s = 20, i, t = 0;ll u = n-1;while(!(u&1)){
t++;u >>= 1;}while(s--){
ll a = rand()%(n-2)+2;x[0] = qpow(a, u, n);for(i = 1; i <= t; i++){
x[i] = multi(x[i-1], x[i-1], n);if(x[i] == 1 && x[i-1] != 1 && x[i-1] != n-1) return false; }if(x[t] != 1) return false;}return true;
}ll gcd(ll a, ll b)
{
if(b == 0) return a;else return gcd(b, a%b);
}ll Pollard_Rho(ll n, int c)
{
ll i = 1, k = 2, x = rand()%(n-1)+1, y = x;while(1){
i++;x = (multi(x, x, n)+c)%n;ll p = gcd((y-x+n)%n, n);if(p != 1 && p != n) return p;if(y == x) return n;if(i == k){
y = x;k <<= 1;} }
}void find(ll n, int c)
{
if(n == 1) return;if(MR(n)){
aria.push(n);return;}ll p = n, k = c;while(p >= n){
p = Pollard_Rho(p, c--);}find(p, k);find(n/p, k);
}int main()
{
ll n;while(~scanf("%lld", &n)){
find(n, 107);cout << aria.front();aria.pop();while(!aria.empty()){
cout << "*" << aria.front();aria.pop();}cout << endl;}return 0;
}
另外,如果要求 n! 的质因数中有几个 m ,可以用如下算法
while(n)
{
n /= m;sum += n;
}