題目:
給定整數 n ,試把階乘 n! 分解質因數,按照算術基本定理的形式輸出分解結果中的 pipi 和 cici 即可。
輸入格式
乙個整數n。
輸出格式
n! 分解質因數後的結果,共若干行,每行一對pi,cipi,ci,表示含有pciipici項。按照pipi從小到大的順序輸出。
資料範圍
1≤n≤1061≤n≤106
輸入樣例:
5
輸出樣例:
2 3
3 15 1
樣例解釋
5!=120=23∗3∗5
解題報告:顯然直接暴力去求解n!,在進行質數分解,和分別求解1-n中的每個數分別進行質數分解的時間複雜度都非常的大,顯然不是很合適。可以知道n!的每個質因子都在1-n之間,先進行一下1-n的質因子篩選,然後去考慮n!中一共含有多少個素因子p。
n!中質因子p的個數為:[n/p]+[n/p^2]+[n/p^3]+……+n[p^k];
可能看到這個式子在各種題解都是直接說可以求得,但是為什麼呢,思考了好久,其實之前咱們去求解n!分別去列舉每個數的質因子分解是按照列的方式去進行的,而上述公式則是按照行的方式去求解,雖然最後的結果是一樣的,但是思考方式是不同的,比如:
求解8!中2的數目:
按照列的方式去求解: 2 1
4 2
6 1
8 3
最後是1+2+1+3=7;
按照行的方式去求解: 1 2 3 4 5 6 7 8
1 1 1 1 (2^1)
1 1 (2^2)
1 (2^3)
最後是4+2+1=7;
可能還是對於這個求解方式還有一定的思考空間,慢慢思考再來補齊吧!
附上普遍ac**:
#includeusing namespace std;
typedef long long ll;
const int maxn=1e6+1000;
int prime[maxn];
bool vis[maxn];
int cnt;
void db_onion()
return res;
}int main()
cout<} }
}
問題 A 階乘分解
題目描述 給定整數n 1 n 10 6 試把階乘n 分解質因數,按照算術基本定理的形式輸出分解結果中的pi和ci即可。輸入乙個整數n。輸出n 分解質因數後的結果,共若干行,每行一對pi,ci,表示含有pi ci項。按照pi從小到大的順序輸出。樣例輸入 複製樣例資料 5樣例輸出 2 33 1 5 1提...
階乘因式分解
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 給定兩個數n,m,其中m是乙個素數。將n 0 n 2 31 的階乘分解質因數,求其中有多少個m。注 為求冪符號。輸入 第一行是乙個整數s 0 輸出輸出m的個數 樣例輸入 3 100 5 16 2 1000000000 13 樣例...
階乘因式分解
描述 給定兩個數m,n,其中m是乙個素數。將n 0 n 10000 的階乘分解質因數,求其中有多少個m。輸入 第一行是乙個整數s 0 輸出輸出m的個數。樣例輸入 2 100 5 16 2 樣例輸出 24 15 includeint main printf d n sum return 0 剛看到這道...