acwing 197. 階乘分解 | 求階乘的質因子個數
阿新 • • 發佈:2022-03-13
目錄
題目描述
給定整數 N,試把階乘 N! 分解質因數,按照算術基本定理的形式輸出分解結果中的 pi 和 ci 即可。
輸入格式
一個整數 N。
輸出格式
N! 分解質因數後的結果,共若干行,每行一對 pi,ci,表示含有pi ci 項。按照 pi從小到大的順序輸出。
資料範圍
3≤N≤10^6
輸入樣例:
5
輸出樣例:
2 3 3 1 5 1
樣例解釋
5!=120=2^3∗3∗5
求質因數
分析
程式碼
暴力做法(TLE)
#include<iostream> #include<unordered_map> #include<cstdio> using namespace std; unordered_map<int, int> h; int n; int main() { cin >> n; for(int i = 2; i <= n; i++) { // 試除法求質數 int t = i; for(int j = 2; j <= i /j; j++) { if(t % j ==0) { int cnt = 0; while(t % j == 0) { cnt++; t /= j; } h[j] += cnt; } } if(t > 1) h[t] += 1; } for(int i = 2; i <= 1000; i++) { if(h[i] != 0) printf("%d %d\n", i, h[i]); } return 0; }
優化做法
#include<iostream> #include<unordered_map> #include<cstdio> using namespace std; int n; const int N = 1000010; int cnt = 0; int primes[N]; bool st[N]; // st[i] = false 表示是質數 // 線性篩法 void get_primes(int n) { for(int i = 2; i <= n; i++) { if(!st[i]) primes[cnt++] = i; for(int j = 0; primes[j] <= n / i; j++) { st[i * primes[j]] = true; if(i % primes[j] == 0) break; } } } int main() { cin >> n; get_primes(n); for(int i = 2; i <= n; i++) { if(st[i]) continue; // 不是質數,跳過 int cnt = 0; long long t = i; // 一個質數 // 注意這裡會爆long long while(t <= n) { cnt += n / t; t *= i; } printf("%d %d\n", i, cnt); } return 0; }
原理: