阶乘分解CH3101(已经倒闭的oj)

题目:给定整数N(1<=N<=1e6),试把阶乘N!分解质因数,按照算术的基本定理的形式输出分解结果中的pi和ci

思路:如果把1-N中的每个数都分解质因数,再把结果合并,时间复杂度为O(N\sqrt{N}),太高了,所以要换一种做法。

我们可以先筛选出来1-N中的每个质因数p,然后再考虑N!中一共含有多少个p。

对于N!中含有多少个P其实就是1-N中每个中有多少个p的和,1-N中至少包含有一个质因子p的至少含有ceil(\frac{N}{P}),含有两个质因子p就是对之前的ceil(\frac{N}{P})继续除以p,一次类推。

code:

#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable:4996)
using namespace std;

typedef long long ll;
typedef double db;
const int INF = 1e9;
const int maxn = 5e4+10;
const int maxm = 1e6 + 10;
int n,t, s;
int v[maxn];
vectorprime;
void primes(int n) {//把1-n的素数都放进vector里
	memset(v, 0, sizeof(v));
	for (int i = 2; i <= n; i++) {
		if (v[i]) continue;
		prime.push_back(i);
		for (int j = i; j <= n / i; j++) v[i*j] = 1;
	}
}
int main() {
	cin >> n;
	primes(n);
	for (int i = 0; i < prime.size(); i++) {
		int p = prime[i], c = 0;
		for (int j = n; j; j /= p) c += j / p;
		printf("%d %d\n", p, c);
	}
	system("pause");
}

 

你可能感兴趣的:(数论,阶乘分解,数论)