我們用 \(a=\overline a_ a_ \cdots a_)_b}\) 表示乙個 \(n\) 位 \(b\) 進製數(大多數情況下 \(b=10\) 或 \(b=2\) )。
令集合 \(s_b=\ a_ a_ \cdots a_)_b}|n\in[1,\infty)\cap z,a_i\in[0,b]\cap z\}\) 為所有 \(b\) 進製數構成的集合
抽象地來說,一般來說數字 \(\text\) 要解決的問題都可以轉化成下面形式的問題:
定義函式 \(p:s_b\to \\) ,求函式 \(f([l,r])=\sum_ p(x)\) 。
科協裡最近很流行數字遊戲。
某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 \(123,446\)。
現在大家決定玩乙個遊戲,指定乙個整數閉區間 \([a,b]\),問這個區間內有多少個不降數。
\(1\le a\le b<2^\)
令 \(s(i)=\sum_ f([st,k])\) 。
若 \(l,r \ge st\) ,那麼一定有 \(f([l,r])= s(r) - s(l-1)\) 。
那麼我們可以將問題轉化為:
我們轉化的問題為有多少整數 \(v \le \overline a_ a_ \cdots a_}\) 滿足從左到右各位數字呈非下降關係。
對於該問題最棘手的限制其實是對 \(v\) 大小限制(上界)的限制。
為了方便思考我們將所有不帶前補 \(0\) 的 \(k < n\) 位 \(b\) 進製數補成帶前補 \(0\) 的 \(n\) 位 \(b\) 進製數。
考慮兩個帶前補 \(0\) 的 \(n\) 位 \(10\) 進製整數:
\(a=\overline a_ a_ \cdots a_}\)
\(b=\overline b_ b_ \cdots b_}\)
其中 \(b < a\) 。
考慮乙個位置 \(k\) ,滿足 \(\forall i> k,a_i=b_i,a_k>b_k\) 。
乙個直觀的標記:
\(a=\overline \cdots a_} \cdots a_}\)
\(b=\overline \cdots b_} \cdots b_}\)
關於這個位置 \(k\) 有兩個顯然但十分重要的性質:
那麼我們就可以將 \(k\) 作為集合劃分的依據,列舉 \(k=k_i\) 時的數的個數。
接下來考慮對於 \(k=k_i\) 時的集合劃分情況:
我們考慮 \(k_i\) 位的取值,因為已經第 \(k_i\) 位一定比 \(a\) 小,所以剩下的 \(k_i\) 位可以隨便填數。
那麼接下來要解決的問題即:
而對於這個問題我們可以用乙個十分簡單的 \(\text\) 解決。
數字DP 總結
數字dp適合在一段數的區間內找出滿足某些條件的數的個數,這個時候往往不能之間遍歷,肯定會超時,則一般使用數字dp來解決。數字dp的常見形式是dp i j 表示開頭是j的i位數滿足條件的有多少個,當然也有其他dp i j k 等等,但i,j,k都很小,不會像直接遍歷那麼耗時。以前做過乙個不要62的題 ...
數字DP總結
數字dp基於動態的思想,記錄狀態以至於不用重複的計算,能夠處理大規模的數 其時間複雜度為o 狀態數 轉移數 狀態數是dp陣列的大小,轉移數是for迴圈大小 這個時間我也不是很想得通,某大佬講的。比較簡單的幾種題型 1 求l r數字中包含某些數字特徵的數量和 如數字子串中是否有13等 hdu 2089...
數字dp總結
到這裡,數字dp就告一段落了,kuangbin的專題還差一道,那一道涉及到了ac自動機,目前還不可做。簡單寫下數字dp的總結 數字dp有它固定的模板,例如solve,dfs函式的大體寫法,和limit的處理。唯一不同的地方就是字首狀態state的維護,最為詳細的state記法就是把前面所選擇的每乙個...