首页 > Windows开发 > 详细

Acwing-197-阶乘分解(质数)

时间:2019-09-22 10:11:29      阅读:107      评论:0      收藏:0      [点我收藏+]

链接:

https://www.acwing.com/problem/content/199/

题意:

给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi 和 ci 即可。

思路:

对于n!, 考虑1-n的质数, 对于每个质数,p^k在n!出现的次数为n/(p^k).
计算k时, 会计算k+1,的次数, 所以每个只用加一次.

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+10;

int IsPri[MAXN], Pri[MAXN];
long long Cnt[MAXN];
int pos, n;

void Euler()
{
    memset(IsPri, 0, sizeof(IsPri));
    memset(Pri, 0, sizeof(Pri));
    memset(Cnt, 0, sizeof(Cnt));
    IsPri[1] = 1;
    pos = 0;
    for (int i = 2;i <= n;i++)
    {
        if (IsPri[i] == 0)
            Pri[++pos] = i;
        for (int j = 1;j <= pos && Pri[j]*i <= n;j++)
        {
            IsPri[Pri[j]*i] = 1;
            if (i%Pri[j] == 0)
                break;
        }
    }
}

int main()
{
    scanf("%d", &n);
    Euler();
    for (int i = 1;i <= pos;i++)
    {
        long long tmp = Pri[i];
        while (tmp <= n)
        {
            Cnt[i] += n/tmp;
            tmp *= Pri[i];
        }
    }
    for (int i = 1;i <= pos;i++)
        printf("%d %lld\n", Pri[i], Cnt[i]);

    return 0;
}

Acwing-197-阶乘分解(质数)

原文:https://www.cnblogs.com/YDDDD/p/11565636.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!