模擬84 題解

2022-03-16 19:19:09 字數 822 閱讀 5484

考慮用已有的光滑數推出新的光滑數。

顯然每次可以取出最小的光滑數,並乘每個質因子插入堆中。

需要通過雜湊表打標記來解決重複計數的問題。

複雜度為$o(kblogk)$,空間應該也承受不住。

正解顯然不帶$log$。

因為我們每次取出的都是最小的光滑數,其實堆有些多餘。

所以考慮如何來去掉這個堆。

受到蚯蚓一題的啟發,因為乘每個質因子的結果是單調遞增的。

可以對乘每個質因子的結果開乙個佇列,每次取出$b$個佇列中的最小值。

然而這樣還不能去重,我們有更好的方法。

在尤拉篩中,我們使每個合數都被它最小的質因子篩出。

所以可以用相同的思想,當對當前質數取模等於0時跳出,可以做到每個光滑數僅被篩一次。

看到這個資料範圍,馬上想狀壓。

序列長度最多為12,似乎並不很難做。

然而一些簡單的狀壓都死掉了。

於是自閉了,決定把$3^$壓進狀態。

只會打$cnt<=3$,$cnt=4$ $16$維陣列分類討論了一年,然而並沒有過樣例。

其實把這個狀壓改成記憶化搜尋就是正解。

因為合法的狀態數並不多,可以直接進行記憶化搜尋。

用雜湊表支援查詢某個狀態的操作,狀態的定義是:

每個不同的因子出現了多少次(0/1/2),

不同的因子指$n$的因子中,質因子集合不同的數。

顯然我們只需要維護這些資訊就可以確定是否可以最多與不超過乙個數不互質。

發現變數其實只有三個。

所以在$n$個行人中隨機選$2$個,三角函式大力解出三個變數。

代入$n$個行人的初始位置,檢驗正確的個數是否合法就完了。

模擬17 題解

t1 a.入陣曲 60 演算法 維護一下某一列的從第一行到這一行和二維字首和 然後列舉上下左右邊界,o n 4 100 演算法 省掉左右邊界的列舉,改為從左向右掃一邊,記錄總和 k的餘數,並放入桶中,可以發現,如果這個值出現過,那說明這個位置的總和減去那個位置的差 即這個區間 是k的正倍數 t2又是...

模擬16 題解

貪心,對於每只青蛙,跳的時候盡量遠,越遠選擇越多 注意若用set實現,要先insert 0 1 include2 include3 include4 include5 include6 include 7 define r register 8using namespace std 9 inline...

模擬113 題解

手玩發現這個東西好像有一點規律。考慮在最優的方案下,每增加乙個點對答案的貢獻 0 1 然後隨便寫寫就好了。把 x 向 x 能偷的節點建邊。發現這個東西一定會形成森林,其中一些樹為基環樹,其餘為普通形態的樹。對於普通形態的樹,顯然可以賺到其中所有能賺的錢。但基環樹對應著不能從環上乙個節點偷另乙個節點。...