线性筛(分解阶乘质因子) - 阶乘分解 - AcWing 197

线性筛 - 阶乘分解 - AcWing 197

给 定 整 数 N , 试 把 阶 乘 N ! 分 解 质 因 数 , 按 照 算 术 基 本 定 理 的 形 式 输 出 分 解 结 果 中 的 p i 和 c i 即 可 。 给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 p_i 和 c_i 即可。 NN!pici

输入格式

一个整数N。

输出格式

N ! 分 解 质 因 数 后 的 结 果 , 共 若 干 行 , 每 行 一 对 p i , c i , 表 示 含 有 p i c i 项 。 按 照 p i 从 小 到 大 的 顺 序 输 出 。 N! 分解质因数后的结果,共若干行,每行一对p_i,c_i,表示含有p_i^{ci}项。按照p_i从小到大的顺序输出。 N!pi,cipicipi

数据范围

1 ≤ N ≤ 1 0 6 1≤N≤10^6 1N106

输入样例:

5

输出样例:

2 3
3 1
5 1

样例解释

5 ! = 120 = 2 3 ∗ 3 ∗ 5 5!=120=2^3∗3∗5 5!=120=2335


分析:

若 对 阶 乘 每 个 乘 数 都 做 一 遍 质 因 子 分 解 再 累 加 , 时 间 复 杂 度 为 O ( n n ) , 不 合 理 。 若对阶乘每个乘数都做一遍质因子分解再累加,时间复杂度为O(n\sqrt{n}),不合理。 O(nn )

可 以 反 过 来 考 虑 , 枚 举 每 一 个 质 因 子 P i , 然 后 计 算 P i 在 n ! 中 的 次 数 是 多 少 。 可以反过来考虑,枚举每一个质因子P_i,然后计算P_i在n!中的次数是多少。 PiPin

先 计 算 [ 1 , n ] 中 有 多 少 P i 的 倍 数 , 共 有 ⌊ n P i ⌋ 个 , 累 加 上 , 先计算[1,n]中有多少P_i的倍数,共有\lfloor\frac{n}{P_i}\rfloor个,累加上, [1,n]PiPin

但 可 能 存 在 某 个 数 能 够 分 解 出 P i 2 , 但 是 在 上 一 步 只 被 计 算 了 一 个 贡 献 , 但可能存在某个数能够分解出P_i^2,但是在上一步只被计算了一个贡献, Pi2

所 以 我 们 要 将 所 有 包 含 因 子 P i 2 的 数 再 统 计 一 个 贡 献 , 所以我们要将所有包含因子P_i^2的数再统计一个贡献, Pi2

故 再 计 算 [ 1 , n ] 中 共 有 多 少 P i 2 的 倍 数 , 共 有 ⌊ n P i 2 ⌋ 个 , 累 加 上 , 故再计算[1,n]中共有多少P_i^2的倍数,共有\lfloor\frac{n}{P_i^2}\rfloor个,累加上, [1,n]Pi2Pi2n

依 次 类 推 . . . 依次类推... ...

直 到 P i k > n 。 直到P_i^k>n。 Pik>n

结论:

n ! 中 每 个 质 因 子 P i 的 次 数 = n P i + n P i 2 + n P i 3 + . . . n!中每个质因子P_i的次数=\frac{n}{P_i}+\frac{n}{P_i^2}+\frac{n}{P_i^3}+... nPi=Pin+Pi2n+Pi3n+...

代码:

#include
#include

#define ll long long

using namespace std;

const int N=1e6+10;

int primes[N],cnt;
int st[N];

void get_prime(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!st[i]) primes[cnt++]=i;
        for(int j=0;primes[j]*i<=n;j++)
        {
            st[primes[j]*i]=true;
            if(i%primes[j]==0) break;
        }
    }
}

int main()
{
    int n;
    cin>>n;
    get_prime(n);
    
    int p,s=0;
    for(int i=0;i<cnt;i++)
    {
        s=0;
        p=primes[i];
        for(int j=n;j;j/=p) s+=j/p;
        cout<<p<<' '<<s<<endl;
    }
    
    return 0;
}

你可能感兴趣的:(数论,算法,数论,线性筛,ACM)