【题解】阶乘因子

题目描述

桐桐刚刚学习了自然数N的阶乘:阶乘(N!)被定义成从1到N的所有整数的乘积,例如5!=5×4×3×2×1=120。随着数N的增大,N!增长的非常快,5!=120,10!=3628800。桐桐想到了一种方法来列举那么大的数:不是直接列出该数,而是按照顺序列举出该数中各个质数因子出现的次数。如825可描述为(0 1 2 0 1),意思是对825分解质因数,这些质数因子中有0个2,1个3,2个5,0个7,1个11。请你编一个程序,读入N值,帮助桐桐按顺序输出N!所包含的质数因子的个数。

输入输出格式

输入格式

一行,一个整数N。(2≤N≤100000)

输出格式

一行,一个N!中所包含的质数因子的个数(从最小的质数开始)的序列,数与数之间用一个空格隔开。

输入输出样例

输入样例

53

输出样例

49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1

题解

表面上看枚举每一个因子的质因子很麻烦,其实可以顺推,枚举每一个数可以作为哪些数的质因子,在这个过程中顺便可以把合数给筛掉。

有一个可以优化的地方:素数除了2以外都为奇数,可以利用这个特性使枚举时间减半。

#include <iostream>
#include <cstdio>

using namespace std;

int n;
int a[100001];
int p[100001];

int main()
{
    scanf("%d", &n);
    int tmp;
    for(register int i = 4; i <= n; i += 2)
    {
        tmp = i;
        while(!(tmp & 1)) tmp >>= 1, ++a[2];
        p[i] = 1;
    }
    printf("%d", a[2] + 1);
    for(register int i = 3; i <= n; i += 2)
    {
        if(p[i]) continue;
        for(register int j = i + i; j <= n; j += i)
        {
            tmp = j;
            while(!(tmp % i)) tmp /= i, ++a[i];
            p[j] = 1;
        }
        printf(" %d", a[i] + 1);
    }
    return 0;
}

参考程序

原文地址:https://www.cnblogs.com/kcn999/p/10339610.html

时间: 2024-10-15 19:35:14

【题解】阶乘因子的相关文章

XDU1019 阶乘因子的个数

题意是让你求一个最小的N, 使得N!有M个0,N的阶乘中2的因子是远多于5的因子的个数, 因此我们统计出5的个数就知道其后面有几个0,对于一个数mid, mid!中5的因子的个数为mid/5 + mid/25 + mid/5^3 + ... 可以发现mid越大mid!中的5的个数越多, 因此我们可以二分答案, 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <iost

Java-Factorial Trailing Zeroes

Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. Credits: Special thanks to @ts for adding this problem and creating all test cases. 看了半天没看懂题目意思 以为要求n结尾0的个数 搞了半天是要求n!即 n的阶乘结

USACO Factorials

题意是给你一个数n, 然后让你求出n!的最后一位非0的数, 消去n!后面所有的0就可以了, 实现的方法是去掉阶乘因子中所有的5和同数量的2就行,代码如下: /* ID: m1500293 LANG: C++ PROG: fact4 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int f[5000]; int main() { freopen("

算法篇——因子和阶乘

来源:<算法竞赛入门经典>例题5.4.2 题目:输入正整数n(2≤n≤100),把阶乘n!=1*2*3*...*n分解成素因子相乘的形式,从小到大输出各个素数(2.3.5...)的指数.例如,5! 表示为 3 1 1(5!=23*31*51=120),程序忽略比最大素因子更大的素数(否则末尾会有无穷多个0) 样例输入: 5 53 样例输出: 5! = 3 1 1 53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1 分析: 注意到n<=100,所以素因子也一定

因子和阶乘

因子和阶乘 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给你一个正整数n,把n!=1x2x3x.....xn分解成素因子相乘的形式,并从小到大输出每个素因子的指数,但要保证最后输出的素因子个数不为0.例如825应表示为0,1,2,0,1表示分别有0,1,2,0,1个2,3,5,7,11. 输入 第一行有一个整数n(0<n<10000),表示有n组测试数据: 接下来n行每行有一个整数 m(1<m<10000) 输出 从小到大输出m分解成素因子相乘后各

Algorithm --&gt; 阶乘和因子

阶乘和因子 要求:输入正整数n(1<n <101), 把阶乘n!=1x2x3x...xn分解成素因子相乘的形式,从小到大输出各个素数(2,3,5,...)的指数. 例如825=3x52x11应表示成(0,1,2,0,1),表示分别有0,1,2,0,1个2,3,5,7,11.程序应忽略比最大素因子更大的素数(否则末尾会有无穷多个0). 样例输入: 5 53 样例输出: 5!=3 1 1 53!=49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1 算法代码: #include &

scau 8637 阶乘与因子 筛素数

时间限制:500MS  内存限制:1000K提交次数:189 通过次数:46 题型: 编程题   语言: G++;GCC Description 游戏玩了很久总会厌的,连Lyd的蚂蚁都被放生了......(参看题目:盒子上的蚂蚁) 于是Mr.Chen 看大家很无聊,就让Lord.Suno 负责新生赛出题的事情,然后大家一起帮忙出题. Lyd 想了很久,想到一个题目,题意如下: 给出两个数,正整数n(n<10)和质数m(m<100),求满足n!=k * m^p 最大的整数p(k 为正 整数).

yzoj P1122 阶乘 题解

T组数据,给出N,求出N!最右边非零的数. 对于30%的数据,N <= 30,T<=10. 对于全部的数据,N <= 10^2009,T<=30. 一道数学题 解析 N!/(10^x)最后一位数字即是结果.10^x进行拆分,变成5^x* 2^x.怎么除以5^x呢,好办,乘的时候含有5的倍数的一项全部不乘进去,再递归此过程.即 1 2 3 4 (15) 6 7 8 9 (25) 11 12 13 14 (35)16 17 18 19 (45) 21 22 23 24 (55) 26

51Nod 1003 阶乘后面0的数量(数学,思维题)

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1003编程之美有讲:一个数 n