解题报告 之 SOJ2666 分解 n!

来源:互联网 发布:苏联解体中国反应 知乎 编辑:程序博客网 时间:2024/06/08 05:00

解题报告 之 SOJ2666 分解 n!


Description

给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式,质因数分解形式为n=p1^m1*p2^m2*p3^m3……* 这里 p1 < p2 < p3 < …… 为质数* 如果 mi = 1, 则 ^ mi 就不需要输出

Input

输入是多case的,每行一个数n,1 < n <= 1000000,当n等于0时输入结束

Output

每个n输出一行,为它的质因数分解形式

Sample Input

670

Sample Output

6=2^4*3^2*57=2^4*3^2*5*7

Author

windy7926778

题目大意:略。

分析:感觉是裸的素数运算性质。素数有一个性质是,n!的质因子分解中,质因子p的个数为PN(n,p)=[n/p]+[n/p^2]+[n/p^3]+…… 直到[n/p^q]==0,其中[ ]表示向下取整。所以这个题我们要分解n!。可以先用素数筛打表,然后逐个逐个分解看看有多少个,最后再输出结果即可。注意输出的格式。

上代码:
#include<iostream>#include<cmath>#include<cstring>using namespace std;int isprime[1010000];long long prime[1010000];int pnum[1010000];int cnt;void getP(){for(int i = 1; i < 1010000; i++)isprime[i] = 1;for(int i = 2; i < 1010000; i++){if(!isprime[i])continue;prime[cnt++] = i;for(int j = 2 * i; j < 1010000; j += i)isprime[j] = 0;}}long long get( long long n ,long long key){int tem = key;long long num = 0;while(n >= key){num += n / key;key *= tem;}return num;}int main(){long long n;getP();while(cin >> n &&n){if(n == 1){cout << "1=1" << endl;continue;}memset( pnum, 0, sizeof pnum );for(int i = 0; prime[i] <= n&&prime[i]; i++){pnum[i] = get( n, prime[i] );}cout << n << "=";bool fst = 0;for(int i = 0; prime[i]  <= n&&prime[i]; i++){if(!fst)fst = true;elsecout << "*";if(pnum[i])cout << prime[i];if(pnum[i]>=2)cout << "^" << pnum[i];}cout << endl;}return 0;}

向梅姐致敬!

1 0