同步
原題鏈結
簡要題意:
乙個數把各位數字乘起來得到另乙個數。已知另乙個數,求最小的「乙個數」。
首先,你發現,假設答案為 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
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
(sizen
)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 個要保證位數盡量的少。在位數盡量少的前提下,我們要讓數盡量小...