Jzoj P5791 階乘___質因數分解+模擬
阿新 • • 發佈:2018-12-13
題目大意:
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; }