題目連結:
題目大意:
(兩題的大意、範例測資是一樣的,但是變數範圍不同)
輸入第一列給定一正整數 T,代表測試資料筆數。接著有 T 列的輸入,每列給定一正整數 N。對於每個正整數試問其對應的 K 值,而 K 值為在 N 所有可能的整數分拆之方法裡,數字乘積值最大者。
例如 N = 5 時,可以拆成
5
4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
這七種。而其中乘積值最大者為 3 + 2 這個方法的數字乘積,即 3 × 2 = 6。因此 N = 5 的 K 值為 6。
而對於 h399 這題,變數範圍為以下:
1 ≦ T ≦ 10 ^ 4
1 ≦ N ≦ 10 ^ 4
h400 則為以下:
1 ≦ T ≦ 2 × 10 ^ 5
1 ≦ N ≦ 2 ^ 32
由於答案可能會很大,因此請將所求取 998244353 的餘數後再輸出。
範例輸入:
3
5
4
1
範例輸出:
6
4
1
解題思維:
其實基本就是
這題,不過該題多了一項規則——數字必須至少拆成兩個數字之和。但是實際上不影響該題的結論。
根據該題我們可以得到一策略——即把 N 拆成盡可能多的 3 、最多兩個 2。準確來說是:
令 X = floor(N ÷ 3),其中 floor() 代表下高斯函數,對於正數來說等價於無條件捨去小數點。
而我們可以根據 N 除以 3 的餘數來分以下三種情況:
一,餘數 = 0:此時 K 值即為 3 ^ X。
二,餘數 = 1:此時 K 值為 3 ^ (X - 1) × 4。
三,餘數 = 2:此時 K 值為 3 ^ X × 2。
而 3 ^ X(或是 3 ^ (X - 1))之值由於次方之值會很大,因此可以使用快速冪(如
這題的中間所述)來計算整個冪次之值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。