我們發現,如果我們將滿足題意的點在數軸上標出,那麼我們可以獲得若干個連續段。對於一個長度為\(l\)的連續段,他對答案的貢獻就是\(\frac{l(l+1)}{2}\),我們把所有連續段的貢獻加起來就得到了答案
於是我們發現這個可以拆分成子問題,具體見這篇題解。\(sol(n-mx,k-1)\)就是拆分成的子問題,因為對於\([2^c,n-1]\)這段區間的點的標記情況與\([0,n-mx-1]\)這段區間的標記情況是完全一樣的(指對於\(i∈[2^c,n-1],j∈[0,n-mx-1],i=j+2^c\),\(i\)被標記當且僅當\(j\)被標記)
中間減去的那個段相當於合併,比如下圖
我們的分治演算法是將綠色和紅色的段當成兩個段的,但實際上應該當做一個段,這個時候就要分別減去綠色的貢獻和紅色的貢獻,再加上綠色加紅色的貢獻就好了
實際上我們到跟二進位制有關,最多隻有\(60\)位,就用的數位DP做的,但是細節比較多。只不過記住,二進位制的題目也有可能拿數位DP做(當然這之前不妨想一想分治)