阶乘分解为算术基本定理的表示形式
一个数字分解为算数基本定理的表示形式可以借助埃氏筛来进行。一个数字的阶乘分解有两种考虑。
- 对阶乘计算中的每一个数字都进行分解,这种想法比较简单直接,但是复杂度较高。
- 求出N以内的所有的质数,设其中一个为P,1到n中含有因子P的个数为N/P向下取整,然后除了这一部分还有一些还有因子P*P,因为刚刚已经计算了一次P,因此此时依然含有因子P(可以理解为把刚刚的因子P都除去了)的有N/(P * P)向下取整个,同理还有P的三次方等等。直到P的M次方大于N了就没有了。因此可以先埃氏筛或者线性筛筛选出N以内的全部素数,然后对每个素数进行上述操作即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
int v[N];
int prime[N], n, num;
typedef long long ll;
#define mem(a, b) memset(a, b, sizeof a)
int main(){
mem(v, 0);
num = 0;
cin >> n;
for (int i = 2; i <= n; i++){
if (v[i] == 0){
v[i] = i;
prime[++num] = i;
}
for (int j = 1; j <= num; j++){
if (prime[j] > v[i] || prime[j] * i > n)break;
v[prime[j] * i] = prime[j];
}
}
int Num;
for (int i = 1; i <= num; i++){
ll y = prime[i];
Num = 0;
for (; y <= n; y *= prime[i]){
Num += n / y;
}
if (Num)printf("%d %d\n", prime[i], Num);
}
return 0;
}
本文来自博客园,作者:correct,转载请注明原文链接:https://www.cnblogs.com/correct/p/16548406.html

浙公网安备 33010602011771号