阶乘分解为算术基本定理的表示形式

一个数字分解为算数基本定理的表示形式可以借助埃氏筛来进行。一个数字的阶乘分解有两种考虑。

  1. 对阶乘计算中的每一个数字都进行分解,这种想法比较简单直接,但是复杂度较高。
  2. 求出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;
}
posted @ 2022-08-03 19:07  correct  阅读(42)  评论(0)    收藏  举报