數論_質數_CH3101_階乘分解
阿新 • • 發佈:2018-11-29
思路分析:
易知n!的所有質因數均不超過n, 故可先預處理2到n之間的所有質數, 對該範圍內的每個質數p, 可以證明將n!分解質因數之後p的冪指數為. 根據此策略給出如下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; }