1. 程式人生 > >Jzoj P5791 階乘___質因數分解+模擬

Jzoj P5791 階乘___質因數分解+模擬

題目大意:

n個正整數a[i],乘積為p,給p乘上一個正整數q,使p*q剛好為正整數m的階乘,求m的最小值。

n<=100000,a[i]<=100000

分析:

將所有的正整數分解質因數,然後就可以得到p的質因數分解,然後將對應質因數個數都記錄下來, 儘可能均攤的往後面的靠前位置放,使得每個因數都僅被使用一次,最後最大的那個因數就是m。 時間複雜度算的怪怪的

程式碼:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define N 10000005

using namespace std;

typedef long long ll;

int b[N], n, l, r;

int main()
{
	freopen("factorial.in","r",stdin);
	freopen("factorial.out","w",stdout);
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) 
	{
		 int x;
	     scanf("%d", &x);
         for (int j = 2; j * j <= x; j++)
         {
         	  if (x == 1) break;
         	  if (x % j == 0) r = max(r, j);
			  while (x % j == 0) b[j]++, x /= j;
		 }
		 r = max(r, x);
		 b[x]++;
	}
	l = 2; 
	while (l <= r)
	{
	  	   if (b[l] > 1)
		   {
		 	   int num = b[l] - 1, begin = l;
			   while (num > 0)
		 	   {
		 	          begin += l;
		 	          if (!b[begin])
		 	          {
		 	              int gg = begin;
				          while (gg % l == 0 && num) 
					             num--, gg /= l;
						  if (begin > r) r = begin;		 	
			          }
		       }
		    }
		    ++l;
	}
	printf("%d\n", r);
	return 0; 
}