牛客小白月賽23 B階乘(質因數分解)

2022-01-19 21:03:57 字數 1345 閱讀 8724

題意:給出p,找出能整除p的最小n!

解析:折騰了一下,四處找人問,總算明白了。先給出第一種解法。

一:p是很大的,要暴力直接乙個乙個找也不可能。給出原理:假設a是b的倍數,如果b能分解出質因子p有q個,那麼在a中也能分解出質因子p,而且次數大於q個。所以根據這個,我們直接把p的素因子分解出來,記錄一下各個出現的次數,再二分一下。這個二分check()裡的意思是,如果mid的階乘可以把p的每個素因子整除而且出現次數大於等於每個q,那麼就是個符合條件的解,二分找出最小就可以了。

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=1e6+10

;ll p[maxn],q[maxn];

int tot=0

;bool

check(ll x)

if(cnt

return

false

; }

return

true;}

intmain()}}

if(n>1

)

while(l

else

}cout}}

二:較為暴力的做法。但是採用了比較巧的優化方法和防止溢位的優化。

直接上列舉,但是如果p是個很大的素數,就不行了。所以從p/i下手,根據觀察,只要p/i是個素數,那麼結果一定就是p/i了。這樣就不會超時了。最後記得累乘ans=ans%p。防止溢位。對於(ans*i)%p==0那麼(ans%p*i%p)%p也是==0的,不會影響結果。

#include#include

#include

using

namespace

std;

typedef

long

long

ll;bool

check(ll x)

return

true;}

intmain()

if(p%i==0&&i*i!=p)

}ans=ans%p;

}cout}}

還可以參考乙個題,hdu1124的本人題解:

牛客小白月賽23 B 階乘

給定乙個正整數 p 求乙個最小的正整數 n,使得 n 是 p 的倍數 第一行輸入乙個正整數t表示測試資料組數 接下來t行,每行乙個正整數p 輸出t行,對於每組測試資料輸出滿足條件的最小的n 412 48124 4這題要用到質因數分解,題解用了二分,其實用不用無所謂,首先,我們知道階乘是幾個數的乘積,...

牛客小白月賽23 B 階乘

b.階乘 思路 其實就是把p質因數分解,然後對於每乙個質因數x,去二分出來最小的乙個n 含有x的個數大於等於p中的x的個數 對於每個二分的結果取最大值 include using namespace std typedef long long ll define me a,x memset a,x,...

階乘 factorial 牛客小白月賽5

輸入資料共一行,乙個正整數n,意義如 問題描述 輸出一行描述答案 乙個正整數k,表示s的末尾有k個0 示例1複製 10複製 7題目讓求階乘最後有幾個0,即為該表示式的最後結果含有10的幾次方的因子,直接求的話,不太好求 不妨轉化一下思路,容易發現10的幾次方都有乙個通性 質因子只有2和5,顯然,階乘...