P2821 變幻數 題解

2021-10-04 17:19:02 字數 1737 閱讀 5124

同步

原題鏈結

簡要題意:

乙個數把各位數字乘起來得到另乙個數。已知另乙個數,求最小的「乙個數」。

首先,你發現,假設答案為 m

mm ,給定 n

nn ,那麼此時 m

mm 的各位數字之積為 nnn.

既然已知 n

nn,那麼我們就應該分解 nnn.

比方說,18=2

×9

18 = 2 \times 9

18=2×9

,那麼答案就是 29

2929

.再比方說,250=2

×5

3250 = 2 \times 5^3

250=2×

53,那麼答案就是 2555

2555

2555

.那麼,無解情況是什麼?

比方說,999=3

37999 = 3^3 \times 37

999=33

×37,此時需要有乙個 37

3737

,但是 37

3737

是兩位數,所以不合法。

因此。n

nn 的質因子不能超過 9

99. 否則不合法。

知道這些之後,我們只要從 9

99 到 2

22 進行除法即可。(高精度除法其實挺簡單的哦~)

那麼你說了,怎麼保證得到的答案一定比 n

nn 大呢?

假設存在答案。那麼 n

nn 每分解乙個 ≤

9\leq 9

≤9的數就會在原來的答案拼上一位,那麼原來的答案至少也是 ×

10\times 10

×10.

那麼也就是說,n

nn 每次會除掉 2

22 ~ 9

99,但答案會 ×

10\times 10

×10. 所以答案肯定比 n

nn 大。證畢。

時間複雜度:o

(size⁡n

)o( \operatorname_n )

o(size

n​)

實際得分:100pt

s100pts

100pts

.這也叫藍題???

#pragma gcc optimize(2)

#include

using

namespace std;

inline

intread()

int x=0;

while

(ch>=

'0'&& ch<=

'9') x=

(x<<3)

+(x<<1)

+ch-

'0',ch=

getchar()

;return x*f;

}int

main()

l=(s[l]

=='0')?

(++l)

:l;//l 表示,除完一次之後被砍掉的位數

}else x--;}

if(l!=s.

size()

-1)puts

("there is no such number!");

//如有解,那麼 2~9 的質因子就應該把 n 變成 1,即全部砍掉。否則說明無解。

else

return0;

}

題解 P2821 變幻數

這道題還真是一道好題。首先,我們想一想,乙個子變幻數要滿足什麼條件。有最大質因子不能超過 9 中的。然後,發現 k 的父變幻數最小就 k 從 9 到 2 去分解 k 然後存起來,最後再反著輸出。為什麼?為了 k 的父變幻數最小,我們第 1 個要保證位數盡量的少。在位數盡量少的前提下,我們要讓數盡量小...