清華集訓2016 你的生命已如風中殘燭

2022-05-16 00:48:15 字數 1007 閱讀 3575

將 \(w_i\) 全部減 \(1\),則問題變成乙個序列,其中給定有 \(n\) 個正數 \(w_i\),其餘都是 \(-1\),和是 \(0\),字首和均非負,求排列方案數。

如果和是 \(1\),且要求字首和全為正數,有結論:每個排列的所有迴圈移位只有 \(1\) 種合法,所以計數圓排列數即可,《具體數學》7.5 章有詳細證明,其實就是每次必須要取最後乙個最小值位置作為起點,使得其他最小值位置跨過序列結尾,字首和為 \(1\),否則如果有兩個相等最小值而取前乙個作為起點,第二個最小值位置字首和是 \(0\)。

本題字首和可以為 \(0\),因此每個最小值都能取,分析失效。

證 catalan 數時,可以在開頭放個 \(1\),但本題中有多種不等價的正數,這種做法是無效的。

在結尾放個 \(-1\),問題變成前 \(m\) 個元素字首和非負,且總和為 \(-1\)。

類似地,所有迴圈移位中現在只能取第乙個最小值位置作為起點了,否則跨過序列結尾,之前的最小值位置字首和會變成 \(-1\)。

\(m+1\) 個點共有 \(m!\) 種圓排列,而序列中有 \(m - n + 1\) 個等價的 \(-1\) 只能取額外放置的 \(1\) 個放在結尾(結尾一定是 \(-1\)),因此答案 \(\displaystyle\frac\)。

p.s. 對於第乙個結論,如果和為 \(s\),那麼有 \(s\) 種迴圈移位。

#include int main() 

for (int i = 2, li = m - n; i <= li; ++i)

s = 1ll * s * i % 998244353;

for (int i = m - n + 2; i <= m; ++i)

s = 1ll * s * i % 998244353;

printf("%d\n", s);

return 0;

}

清華集訓2016 汽水

試題描述 牛牛來到了乙個盛產汽水的國度旅行。這個國度的地圖上有n個城市,這些城市之間用 n 1 條道路連線,任意兩個城市之間,都存在一條路徑連線。這些城市生產的汽水有許多不同的風味,在經過道路 i 時,牛牛會喝掉 wi 的汽水。牛牛非常喜歡喝汽水,但過量地用汽水是有害健康的,因此,他希望在他旅行的這...

清華集訓2016 資料互動

題目描述 乙個簡單的網路系統可以被描述成一棵無根樹。每個節點為乙個伺服器。連線伺服器與伺服器的資料 線則看做一 條樹邊。兩個伺服器進行資料互動時,資料會經過連線這兩個伺服器的路徑上的所有服務 器 包括這兩個伺服器 自身 每個資料互動請求都有乙個非負的重要度,越重要的請求顯然需要得 到越高的優先處理權...

清華集訓2016Day4

用盧卡斯定理可知滿足條件即將 n 和 m 分別用 k 進製表示,要求 n 的每一位都要大於等於 m 的對應位。直接數字 dp 設 f 表示處理到第 i 位,n 是否觸上界,m 是否觸上界時的方案數。複雜度 o t log kn include include includeusing namespa...