題意:P(x)=x各個數字位的乘積。x<=10^1000,求min{ans|ans>x && P(ans)=P(x)}。
顯然如果x的數字位含有0,分兩種情況:
1):只有一個0,如果0在個位數,那么x+10就是最優解了。如果0不在個位數,則x+1就是最優解。
2):有2個或2個以上的0,那么x+1就是最優解。
證明略,很容易看出的。
接下來就是處理不含0的情況。
把x的各個數字位分解質因子。只有2,3,5,7這4個素數。
然后從高位深搜解,這里有加些剪枝。就是在搜索的時候每步都有保證搜到的解>=x。這樣的話就會很快的搜到最優解。具體實現就是設一個flag值,flag為真表示當前搜的解>x否則=x。如果flag為真,則改數字位從1開始搜到9,如果flag不為真,則改狀態的數字位從x原本的數字位開始搜,只要碰到改狀態的數字大于原本的數字位就要改flag為真。這樣就可以保證比較快的搜到解了。然后隨便在了點雜七雜八的剪枝就差不多了。
最后還要在判斷剛才的搜索有沒有找到解,如果沒有找到解,那么只剩一種情況了,就是增加一個數字位'1';排序,輸出。
我的搜索已經寫的很暴力了,str函數狂用,用時10ms。
不知道有沒有更高效的做法,或者有直接更妙的構造方法呢?
——by yayamao