【题解】CH3101阶乘分解 线性筛

题目链接

描述

给定整数 N(1≤N≤10^6),试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 p_i 和 c_i 即可。

输入格式

一个整数N。

输出格式

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

样例输入

5

样例输出

2 3
3 1
5 1

样例解释

5! = 120 = 2^3 * 3 * 5


N!中质因子p的个数为∑(N/p^k)(p^k<=N)(我打不来公式……)
详见李煜东《算法竞赛进阶指南》P134

#include
const int N=1e6+10;
bool iscomp[N];
int prime[N],p;
int n;
void primetable()
{
    for(int i=2;i<=n;i++)
    {
        if(!iscomp[i])prime[p++]=i;
        for(int j=0;j*i<=n;j++)
        {
            iscomp[prime[j]*i]=true;
            if(i%prime[j]==0)break;
        }
    }
}
int main()
{
    scanf("%d",&n);
    primetable();
    for(int i=0;iint sum=0;
        for(int j=n;j;j/=prime[i])sum+=j/prime[i];
        printf("%d %d\n",prime[i],sum);
    }
    return 0;
}

总结

线性筛

你可能感兴趣的:(算法竞赛进阶指南,Contest,Hunter,线性筛,扩展欧几里得)