阶乘分解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<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#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];
vector<int>prime;
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");
}

猜你喜欢

转载自blog.csdn.net/qq_17175221/article/details/81663108