牛客網分糖果 容斥計數DP(還是個坑)

2022-09-10 00:24:31 字數 1120 閱讀 6871

太弱了,題解都看不懂orz orz orz orz

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

n 個小朋友圍成一圈,你有無窮個糖果,想把其中一些分給他們。

從某個小朋友開始,我們順時針給他們標號為 1 ~ n。第 i 個小朋友可以得到至多 a[i],至少 1 個糖果。

問,有多少種分配方案使得每一對相鄰的小朋友拿到的糖果數不同。答案對 10^9 + 7 取模。

第一行乙個整數 n。

接下來一行 n 個整數,第 i 個數表示 a[i]。

一行乙個整數,表示答案。
示例1

複製

3

3 3 3

複製

6

題目限制相當於任意兩人分到的糖果數不同,由乘法原理知答案為 3 * 2 * 1 = 6

示例2複製

4

4 4 4 4

複製

84

對全部的測試資料,n <= 10^6, a_i <= 10^9

* 10 分的資料,n <= 4

* 10 分的資料,n <= 100, a_i <= 20

* 20 分的資料,n <= 100, a_i <= 100

* 10 分的資料,n <= 10^5, a_i 全部相等

* 30 分的資料,n <= 10^5, a_i 為隨機生成

* 20 分的資料,n <= 10^6.

對於一條鏈,dp[i]表示從1到i的方案數,轉移應該是dp[i] = dp[i-1]*a[i] 但這樣就有可能算到相鄰的方案數應該減去dp[i-2]*min(a[i],a[i-1])但這樣又可能減多,去掉了i,i-1,i-2項都相同的情況。那麼就有乙個容斥方程f[i] = sigma(f[j]*(-1)^(i-j-1))(j現在考慮對於乙個環來說,最終答案應該為f[n]再減去n和1相同的情況。為保證n和1一定能取到相同的情況,並且避免分類討論,我們把這個環繞個圈,使得a[1]為最小的那乙個。那麼我們如果依然按照之前的方式f[n]=sigma(f[j]*(-1)^(i-j-1))(j未完待續

容斥定理 牛客簽到題

題目鏈結 題目描述 無奈之下痛定思痛,ne決定也帶上自己的10的九次方個小夥伴去gankff。ff提前得知了這個訊息,這可把ff急壞了.那可是10的九次方個人啊!這時ff的小夥伴en說 ff莫慌,我這裡有3盞bd哥的神燈,上面分別有乙個素數,可以讓編號被上面的數字整除的人昏睡過去,這樣就可以大大削減...

SDUT 2455 分糖果(容斥原理)

題目鏈結 第一眼看到這個題問題的時候覺得是水dp啊,狀態轉移很容易看出來dp i j sum dp i 1 j k 0 k p dp i j 前i個人,已經分了j個糖果的方案。大約o n 3 的複雜度,我就交了,果斷tle,然後想了想把列舉k給優化掉,o n 2 複雜度,目測應該沒有問題了把。結果還...

牛客網刷題之分糖果

題目描述 有n個小朋友站在一排,每個小朋友都有乙個評分 你現在要按以下的規則給孩子們分糖果 每個小朋友至少要分得一顆糖果 分數高的小朋友要他比旁邊得分低的小朋友分得的糖果多 你最少要分發多少顆糖果?題目分析 給定陣列每個位置表示乙個排成一排的小朋友,每個位置上是小朋友的評分,返回結果是每個小朋友的糖...