#45308: 解題思路


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
d775. NOIP2009 3.细胞分裂 -- NOIP2009普及组第三题 | From: [123.192.228.253] | 發表日期 : 2025-02-11 23:56

懶人包: 質因數分解

 

--

 

題目的敘述又臭又長,但簡單來說:

 

有 n 種細胞, M = m1^m2 個瓶子;

每個細胞最一開始都是 1 個,每過一秒就會變成 Si 倍;

如果要能夠拿來做實驗,必須得讓那個細胞的總數能被瓶子的總數整除;

求最快能在多少時間內取得實驗用的樣本。

 

--

 

那怎麼才能知道最短時間呢?

 

你可以跑一個 while 循環,每次循環檢查是否能被 M 整除,然後愉快的吃 TLE......

 

因為有永遠無法整除這情況存在呢

且數字很大,大到超過 long long 的範圍,計算 30000 的 10000 次方顯然是不太理智的行為

所以我們需要更快、更簡單的方法,如果可以不用做大數運算更好

 

思考:

每個細胞最一開始都是 1 個,每過一秒就會變成 Si 倍

 

這段話翻譯成數學,把時間設為 t ,每秒就會有 Si^t 個細胞;

若 M 想要整除 Si^t ,則 Si^t 必須要包含 M 的所有質因數,漏一個都永遠無法整除。

 

不能想像嗎? 最簡單的例子就是

M=2
Si = 3

無論 Si 堆到幾次方,永遠都不可能被 2 整除

 

再換一組數字

M=12
Si=6

當 t=2 時,就可以被 M 整除了,因為 12 的質因數,6 都有

 

而我們只需要判斷質因數分解後,將兩數每個質因數的冪相除、再無條件進位,取最大值,就可以得到 t 的最小值。

以上面的例子來說

M = 12 = 2^2 * 3^1

Si = 6 = 2^1 * 3^1

2 的冪相除 = 2 / 1 = 2
3 的冪相除 = 1 / 1 = 1

取最大值 = 2

這就是答案

 

--

 

整體思路就是對每個數字都做質因數分解,包含一開始的 m1^m2

 

 

參考答案: gist(python)

自己看了都覺得有點醜的寫法

 

 
ZeroJudge Forum