2020 9 3 NOIP模擬賽 T1 排列

2022-09-17 00:30:19 字數 1130 閱讀 6221

題目鏈結

這是noip良心模擬賽的第一題

求對於任意的 \(i\) 滿足 \(|p_i - i| \not = k\) 的排列數。 \(n,k \le 10^5\)

首先 \(k=0\) 直接錯排數。

\(k=1\) 考慮容斥。假設我們能算出來 \(g_i\) 表示欽定 \(i\) 個位置不合法的方案數,那麼答案應該是

\[\sum_^n(-1)^ig_i(n-i)!

\]注意不是二項式反演,因為它並不需要反演,而是直接上容斥,我們可以輕鬆地用 \(g\) 來表示答案。

現在我們需要求出 \(g_i\),即欽定 \(i\) 個位置不合法的方案數。

雖然我們是在欽定「不合法位置」,但是那只是不符合 \(|p_i - i| \not= k\),還需要符合排列的性質,即不能讓兩個位置是同乙個數。我們發現這種限制關係可以被劃分成 \(n/k\) 條鏈,每條鏈是由若干相距 \(k\) 的元素組成的。鏈與鏈之間獨立,可以直接揹包。故現只考慮一條鏈上選 \(i\) 個的方案數。

建立圖論模型:將其看做二分圖,發現左右部的出邊是互不影響的,於是可以拆成兩條鏈。對於一條鏈來說,我們對其的要求就僅有不能選擇相鄰的兩個元素。此模型詳見我的部落格,答案是 \(\)

這樣我們就得到了一些揹包,我們的任務是把他們合併起來。而這個可以用 ntt 優化到 \(n^2logn\)。並且發現這些揹包只有兩種,於是可以多項式快速冪搞。複雜度 \(o(nlogn)\)。又發現揹包元素只有 \(n/k\),於是我們可以直接取夠 \(n\) 個樣本然後直接 dft 後快速冪即可。複雜度 \(o(nlogp)\)

code:

ll f1[n], f2[n];

ll a[n], b[n];

int r[n];

int limi = 1, l;

inline void init()

int ct;

inline void ntt(ll *a, int type)

ll tmp[n];

inline void mul(ll *a, ll *b)

inline void pow(ll *a, int k)

int main()

Noip模擬賽總結(無題面)T1

首先是第一道貪心題。果然是我貪心做的少了 首先我不該把多重復合的一次函式拆開,我應該把最裡面的解出來,然後迭代解,我拆開後,1是沒有什麼優美的性質,2是變得更複雜 然後t1就是類似國王遊戲這樣的,因為確實可以只考慮前後兩個係數間的關係 而他要求安排順序,又不能 啟發式 安排,只能說確定一種排序規則,...

NOIP2018校模擬賽 T1 階乘

有n個正整數a i 設它們乘積為p,你可以給p乘上乙個正整數q,使p q剛好為正整數m的階乘,求m的最小值。共兩行。第一行乙個正整數n。第二行n個正整數a i 共一行乙個正整數m。16 看到這個題目描述只有一行我心頭就湧上一股不祥的預感 一般這種題 都比較 那啥 是的,這個題我又寫炸了 好的讓我們來...

20161023 NOIP 模擬賽 T1 解題報告

task 1.紙盒子 box.pas box.c box.cpp 題目描述 mcx是乙個有輕度潔癖的小朋友。有一天,當他沉溺於數學卷子難以自拔的時候,恍惚間想起在自己當初學習概率的時候準備的一堆橡皮還雜亂地堆在自習室裡。這顯然是他無法容忍的。於是他決定做乙個體積為v v abc 的紙盒子,以便能整齊...