1. 程式人生 > >數論_質數_CH3101_階乘分解

數論_質數_CH3101_階乘分解

點此開啟題目頁面

思路分析:

    易知n!的所有質因數均不超過n, 故可先預處理2到n之間的所有質數, 對該範圍內的每個質數p, 可以證明將n!分解質因數之後p的冪指數為\left \lfloor \frac{n}{p} \right \rfloor+\left \lfloor \frac{n}{p^{2}} \right \rfloor+...+\left \lfloor \frac{n}{p^{m}} \right \rfloor, p^{m}<= n. 根據此策略給出如下AC程式碼:

//CH3101_階乘分解
#include <iostream>
#include <map>
#include <cstring>
using namespace std;
const int MAX = 1e6 + 5;
int primes[MAX], N;//primes[i]為1表示質數, 為2表示合數 
map<int, long long> res;//N!分解的結果 
//篩法求2...n之間的素數
void getPrimes(int n){
	memset(primes, 0, sizeof(primes));
	for(int i = 2; i <= n; ++i)
		if(!primes[i]){
			primes[i] = 1; for(int j = i; j <= n / i; ++j) primes[j * i] = 2;
		}
} 
int main(){
	getPrimes(MAX - 1), cin >> N;
	for(int i = 2; i <= N; ++i)
		if(primes[i] == 1){
			long long sum = 0; for(long long p = i; p <= N; p *= i) sum += N / p;
			if(!res.count(i)) res[i] = sum; else res[i] += sum;
		}
	for(map<int, long long>::iterator it = res.begin(); it != res.end(); ++it)
		cout << it->first << " " << it->second << endl;
	return 0;
}