数论

X的因子链

知识点

筛质数,算术基本定理

算术基本定理

就是因式分解的定理,所有的整数都可以唯一分解成若干个质因子乘积的形式。

202203041956266

筛质数

[筛质数 - 初# - 博客园 (cnblogs.com)]

思路

找出x的最小因式分解,因子链为a1+a2+a3....。满足最大长度的序列的个数为(α1+α2+…+αk)!/α1!⋅α2!⋅…⋅αk!。所以在线性筛质数中要有一个数组记录某个数的最小因子值。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
const int N = (1 << 20)+10;
using namespace std;
typedef long long LL;
int primes[N],cnt;
int pind[N];
bool st[N];
void get_primes(int n){
    for(int i=2;i<=n;i++){
        if(!st[i]) {
            primes[cnt++]=i;
            pind[i]=i;
        }
        for(int j=0;i*primes[j]<=n;j++){
            int p=primes[j]*i;
            st[p]=true;
            pind[p]=primes[j];
            if(i%primes[j]==0) break;
        }
    }
}
int main()
{
    get_primes(N-1);
    int x;
    int sum[N];
    while(scanf("%d",&x)!=-1){
        int tot=0,k=0;
        while(x>1){
            int p=pind[x];
            sum[k]=0;
            while(x%p==0){
                x/=p;
                tot++;
                sum[k]++;//记录k的数值。
            }
            k++;
        }
        LL res=1;
        for(int i=1;i<=tot;i++) res*=i;
        for(int i=0;i<k;i++)
            for(int j=1;j<=sum[i];j++)
            res/=j;
        printf("%d %lld\n", tot, res);
    }
}
posted @ 2022-03-24 19:26  初#  阅读(38)  评论(0)    收藏  举报