1. 程式人生 > >階乘分解

階乘分解

問題 A: 階乘分解

時間限制: 1 Sec  記憶體限制: 128 MB

題目描述

給定整數N(1≤N≤10^6),試把階乘N!分解質因數,按照算術基本定理的形式輸出分解結果中的pi和ci即可。

 

輸入

一個整數N。

 

輸出

N! 分解質因數後的結果,共若干行,每行一對pi, ci,表示含有pi^ci項。按照pi從小到大的順序輸出。

 

樣例輸入

複製樣例資料

5

樣例輸出

2 3
3 1
5 1

 

提示

5! = 120 = 2^3 * 3 * 5

篩素數,求<=N的所有素數出現的個數

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int prim[80005], vis[1000005], n, tot;

void get_prim(int x){
	for (int i = 2; i <= x; i++){
		if(!vis[i]) prim[tot++] = i;
		for (int j = 0; j < tot && prim[j] * i <= x; j++){
			vis[prim[j] * i] = 1;
			if(i % prim[j] == 0) break;
		}
	}
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%d", &n);
	get_prim(n);
	for (int i = 0; i < tot; i++){
		LL t = prim[i]; //注意t可能超過int型
		LL ans = 0;// 同上
		while(t <= (LL)n){
			ans += n / t;
			t *= prim[i];
		}
		printf("%d %lld\n", prim[i], ans);
	}

	return 0;
}
/**/