題目大意:我們稱只要某數字的十進位制表示中有三個連續的6,我們就稱它為「魔鬼數」,比如:666,1666,6663,16666 等。現給出乙個數x,求「第x小的魔鬼數」。x≤5
×107
x\le 5\times 10^7
x≤5×10
7,一共有t組資料點,t
≤1000
t\le1000
t≤1000
。這一道題顯然是一道數字dp的題目,那麼我們先來了解一下什麼是數字dp
眾所周知
給定乙個閉區間 [l,
r]
[l,r]
[l,r
],讓你求這個區間中滿足某種條件的數的個數。
對於這類題目,我們通常先用動態規劃進行預處理,再基於拼湊思想,用「試填法」求出最終的答案。
面對這樣的一道題,如果直接每次都列舉到第x個「魔鬼數」,肯定會超時。那麼我們思考一下如何解決這個問題呢?
其實,這是一道數字dp的典型例題,根據其通常做法,我們可以打出乙個表記錄一下魔鬼數的個數,然後通過一些
「玄學 」的處理,來巧妙計算出第x個「魔鬼數」
我們設f[i
,3
]f [i,3]
f[i,3]
表示由i位數字構成的魔鬼數有多少個,
f [i
,j](
0≤j≤
2)
f [i,j] (0\le j \le2 )
f[i,j]
(0≤j
≤2) 表示由i
ii位數字構成,開頭已經有連續j
jj個6的非魔鬼數有多少個。(注意:在計算f時,我們允許前導0存在)。
實際上,在這裡**f[i
,3
]f [i,3]
f[i,3]
與 f[i,
j]
f[i,j]
f[i,j]
具有的含義是不同的。所以這兩者不是以同一種方式轉移的**
對於f [i,3
i,3i,
3] :它代表的是由i
ii位數字組成含有連續3個6的總方案數,這裡的6並不一定從第i
ii位開始,
然而對於f [i,j
i,ji,
j] :它代表的是從第i
ii位開始的有j
jj個6的方案數。
那麼,在考慮第i
ii位(最高位)是什麼數字時,易得轉移方程:
簡要概述一下上述轉移方程:
首先,對於j=0
j=0j=
0 的情況,即第i
ii位不放6,此時第i
ii位可以考慮從0∼9
0\sim9
0∼9除6以外的所有情況,此時一共有9種選擇,而i−1
i-1i−
1位往後,無論選了乙個6 oror
or兩個6都可以向此狀態轉移。
其次,再考慮j=1
j=1j=
1與j=
2j=2
j=2的情況,此時就很顯然第i−1
i-1i−
1位必須選乙個或者兩個,不過多贅述。
l as
tnot
thel
east
last\:\:not\:\:the\:\:least
lastno
tthe
leas
t f [i
,3
]f [i,3]
f[i,3]
的轉移就不一樣了,它又該分2種情況討論:
首先,是三個6從第i
ii位開始往下排,此時應該顯然由f[i
−1,2
]f [i-1,2]
f[i−1,
2]的方案數轉移過來,
然後由於還要繼承前i−1
i-1i−
1位的方案數,
又由於第i
ii位從0∼9
0\sim9
0∼9都可以選,且不會與之前重複,所以應該是10×f
[i−1
,3
]10\times f[i-1,3]
10×f[i
−1,3
] 至此,完成動態規劃後,預處理就完成了,我們就可以開開心心,快快樂樂的進入下一步了。
至此我們從左到右依次考慮每一位,同時記錄當前末尾已經有連續的幾個6。
從小到大列舉當前數字填的數字,通過預處理的f
ff陣列來直接計算魔鬼數的個數,與x
xx比較即可。
下面就是激動人心的上**時間了!
!!
#include
#include
#include
#include
#define ll long long
using
namespace std;
ll f[22]
[4];
//int t,x;
intmain()
while
(t--
)printf
("%d"
,j);
break;}
}puts(""
);}}
這是本蒟蒻的第一篇題解,寫出來還是很激動的,看著這一篇完完整整的題解,很有成就感。謹以這一篇題解紀念我接近一年半的oioi
oi生涯吧。(估計考完就退役了)
還有最後7天就要參加csp
−s
csp-s
csp−
s的比賽了,希望rp+
+!!!
rp++!\:!\:!
rp++!!
!
Poj3208 啟示錄 數字統計 DP
這題長得就比較像數字 dp 叭.所以先用 dp 進行預處理,再基於拼湊思想,通過 試填法 求出最終的答案.設 f i 3 表示由 i 位數字構成的魔鬼數有多少個,f i j 0 j 2 表示由 i 位數字組成的,開頭有 j 個 6 的非魔鬼數有多少個.注意,在計算 f i j 時允許前導 0 的存在...
遊戲啟示錄
暑假期間因為比較清閒,玩了很多遊戲。有些是近幾年的新遊戲,有些是古老的遊戲。自己在玩遊戲的過程中也總結出一些遊戲設計上的心得。下面一一介紹 1.魔法師傳奇。這個遊戲最近幾年出了第2部。可惜不知道是什麼原因,畫面是跳動的,而且進入遊戲後動滑鼠就宕機。無奈只得將其刪除。它是由曾經開發過 幽浮 的英國著名...
「摩根」啟示錄
摩根 啟示錄 1 摩根 公司創立 摩根 公司創立於2006年4月1日的一次 戰略管理與決策 沙盤模擬訓練。非常感謝公司給我們這樣一次全面體驗企業經營的機會。1.1沙盤模擬 沙盤模擬訓練源自西方軍事上的戰爭沙盤模擬推演,完全不同於傳統的灌輸授課方式,它通過模擬企業執行,使受訓者在主導 企業 各項經營管...