1. 程式人生 > >【數論】JZOJ_5791 階乘

【數論】JZOJ_5791 階乘

題意

給出NN個數,它們的乘積為PP,求出最小的MM,且M!M!可以整除PP

思路

一個數可以分解成若干個質數的積,所以我們可以把PP分解質因數,其實也就是分別把這NN個數分解質因數。

然後M!M!能整除PP,前提是M!M!每個質因子的指數都大於PP的每個質因子的質數,這樣子才能約掉。

對於PP的每個質因子qq,找到一個數kk,使得kk最小且k!k!的質因子qq的指數都大於等於PPqq的指數。

這些kk中取最大的就是答案。因為這些kk中,大的kk的階乘的質因子就包含了小的kk的階乘的質因子,所以最大的kk的階乘是滿足質因子指數都大於等於P

P的質因子指數的。

程式碼

#include<cstdio>
#define max(a, b) (a) > (b) ? (a) : (b)

int N, a, ans;
int p[100001];

int main() {
	scanf("%d", &N);
	for (int i = 1; i <= N; i++) {
		scanf("%d", &a);
		for (int j = 2; j * j <= a; j++)
			for (; a % j == 0; p[j]++, a /= j);
		if (a > 1) p[a]++;
//分解質因數 } for (int i = 2; i <= 100000; i++) { if (p[i]) { int result = i; for (; p[i]; result += i) {//在加i才能讓質因子中i個數變多 //例如5!中只有1個5,再加上5就變成10!,變成2個5 int t = result; while (t % i == 0 && p[i]) t /= i, p[i]--; } ans = max(ans, result - i);//多加了一次 } } printf(
"%d", ans); }