1. 程式人生 > >洛谷 P2043 質因子分解 分解質因數

洛谷 P2043 質因子分解 分解質因數

題目描述

對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;
const
int 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 的題解