題目:
給出nn
個數a[1]
,a[2
]...
a[n]
a[1]
,a[2
]...
a[n]
,求a[1]
×a[2
]×..
.×a[
n]a[
1]×a
[2]×
...×
a[n]
是m!m!
因數的最小的mm。
首先,我們可以把這n
n個數分解質因數,並將每個質因數存在乙個桶裡。
那麼我們設分解後有k[1
]k[1
]個x[2
]x[2
],k[2
]k[2
]個x[2
]...
k[m]
個x[m
]x[2
]...
k[m]
個x[m
],那麼原本的a[1
]×a[
2]×.
..×a
[n]a
[1]×
a[2]
×...
×a[n
]就變成了:x[
1]k[
1]×x
[2]k
[2]×
...×
x[m]
k[m]
x[1]
k[1]
×x[2
]k[2
]×..
.×x[
m]k[
m]其實也就是說,將m!分解質因數後一定含有k[1]個x[1],k[2]個x[2],一直到k[m]個x[m]
。
我們知道,如果m!m
!分解質因數後含有x[1
]k[1
]×x[
2]k[
2]×.
..×x
[m]k
[m]x
[1]k
[1]×
x[2]
k[2]
×...
×x[m
]k[m
],那麼(m+
1)!(
m+1)
!就一定含有x[1
]k[1
]×x[
2]k[
2]×.
..×x
[m]k
[m]x
[1]k
[1]×
x[2]
k[2]
×...
×x[m
]k[m
]。原因很簡單。
證:設t=所以,也就是說,m!mx[1]
k[1]
×x[2
]k[2
]×..
.×x[
m]k[
m]t=
x[1]
k[1]
×x[2
]k[2
]×..
.×x[
m]k[
m],那麼由於m!m
!分解質因數後含有t
t,那麼m!m
!就可以寫成txt
x,其中x
x為正整數。由於(
m+1)
!=m!
×(m+
1)=t
x(m+
1)(m
+1)!
=m!×
(m+1
)=tx
(m+1
)所以(m+
1)!(
m+1)
!就一定含有x[1
]k[1
]×x[
2]k[
2]×.
..×x
[m]k
[m]x
[1]k
[1]×
x[2]
k[2]
×...
×x[m
]k[m
]證畢。
!裡含有的因式(m+
1)(m
+1)一定含有,那麼(m+
2)(m
+2)也含有,(m+
3)(m
+3)也含有。。。
所以,這個階乘很明顯是單調的。
那麼就可以二分答案q
q。若q!q
!含有k[1
]k[1
]個x[1
]x[1
],k[2
]k[2
]個x[2
]...
k[m]
x[2]
...k
[m]個x
[m]x
[m],那麼q!q
!就是合法的解,由此又可以得到大於q
q的數的階乘也是合法的解。所以最小的答案就在[1,
q][1
,q]中。
否則就在[q+
1,ma
xn][
q+1,
maxn
]中。ma
xnma
xn的話設大一點就好了。反正二分又不會很多次。
時間複雜度:o(n
n+nl
ogn)
o(nn
+nl
ogn)
#include
#include
#define ll long long
#define n 5000100
using
namespace std;
int n,m,l,r,mid,num[n]
;bool
check
(int x)
if(sum)return
false
;//不夠
}return
true;}
intmain()
if(x>
1) num[x]++;
} l=1;
r=n-1;
while
(l<=r)
printf
("%d\n"
,r+1);
return0;
}
JZOJ5791 階乘 二分 數論,數學
題目 給出nn 個數a 1 a 2 a n a 1 a 2 a n 求a 1 a 2 a n a 1 a 2 a n 是m m 因數的最小的mm。首先,我們可以把這n n個數分解質因數,並將每個質因數存在乙個桶裡。那麼我們設分解後有k 1 k 1 個x 2 x 2 k 2 k 2 個x 2 k m ...
JZOJ 5791 階乘 數論
description 有n個正整數a i 設它們乘積為p,你可以給p乘上乙個正整數q,使p q剛好為正整數m的階乘,求m的最小值。input 共兩行。第一行乙個正整數n。第二行n個正整數a i output 共一行乙個正整數m。題目要求乙個最小的m mm使m!m!m!包含p pp這個因子。可以把p...
二分 假 數論 分數
nput 第一行包含兩個正整數n和p,表示選手的個數以及精度要求。接下來的n行,每行包含乙個0到100 閉區間 內的整數。output 輸出乙個實數,取p位有效數字,下取整。sample input 5 4 100 20 15 10 8 sample output 195.2 data constr...