洛谷 P2043 質因子分解 分解質因數
阿新 • • 發佈:2018-11-02
題目描述
對N!進行質因子分解。
輸入輸出格式
輸入格式:
輸入資料僅有一行包含一個正整數N,N<=10000。
輸出格式:
輸出資料包含若干行,每行兩個正整數p,a,中間用一個空格隔開。表示N!包含a個質因子p,要求按p的值從小到大輸出。
輸入輸出樣例
輸入樣例#1: 複製10輸出樣例#1: 複製
2 8 3 4 5 2 7 1
說明
10!=3628800=(2^8)*(3^4)*(5^2)*7
與數論硬剛到底。。。
質因數:質因數(或質因子)在數論裡是指能整除給定正整數的質數。兩個沒有共同質因子的正整數稱為互質。因為1沒有質因子,1與任何正整數(包括1本身)都是互質。正整數的因數分解可將正整數表示為一連串的質因子相乘,質因子如重複可以指數表示。根據算術基本定理,任何正整數皆有獨一無二的質因子分解式。只有一個質因子的正整數為質數。
舉幾個例子吧
6的質因數是2和3
2,4,6,8的質因數只有2
那麼對於這道題來說,我們只要分解階乘的每一位就好了(真的算完的話會炸)
完整程式碼
#include<bits/stdc++.h> using namespace std; constint MAXN=10005; bool vis[MAXN]; int n,a[MAXN]; void su() { vis[0]=vis[1]=1; for(int i=2;i<=n;i++) if(!vis[i]) for(int j=2;i*j<=n;j++) vis[i*j]=1; } void div(int k) { int t=k; if(!vis[k]) { a[k]++; return; } for(int i=2;i<=t;i++) {if(!vis[i]) { if(k%i==0) a[i]++,k/=i,i--; } } } int main() { cin>>n; su(); for(int i=1;i<=n;i++)div(i); for(int i=1;i<=n;i++) if(a[i]) cout<<i<<' '<<a[i]<<endl; return 0; }
參考大佬@fleetingtime 的題解