牛客練習賽71 C 數學考試

2021-10-24 14:56:46 字數 1319 閱讀 1074

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

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

64bit io format: %lld

牛牛在樹剖姐姐的數學考試裡出了乙個題,但是樹剖姐姐不會做,於是她向您求助。

求 1\sim n1∼n 的排列,有 m 個限制條件,第i個限制條件 p_ipi​

表示前 p_ipi​

個數不能是 1\sim p_i1∼pi​

的排列,求符合要求的排列的個數。

答案對 20000311 取模。

第一行兩個 n,m

第二行 m 個數,每兩個數之間用乙個空格隔開,第i個數是pi,保證pi互不相同

乙個數,表示符合要求的排列個數對 20000311 取模的結果

4 03 2

2 13 1 2,3 2 1,2 3 1三種合法

4 21 3

114 5

14 1 91 98 10

n\leq 2000n≤2000,m,p_in個數的排列方式共有n!種,將不滿足條件的方案減掉便是本題的答案。

但是,例如:

第i個限制條件 pi表示前 pi個數不能是1∼pi的排列,如果給定的每個條件都單獨計算的話,就會出現重複的現象,所以需要考慮容斥,先將給定的條件從小到大排序,後面的情況需要考慮前面的是否被計算過,每種情況就是前面的數的排列方式乘以後面數的排列方式,由於有重複的情況,每次都要把前面重複了的減去。

#include

using

namespace std;

typedef

long

long ll;

typedef

double db;

const

int n=

2500

;const ll mod=

20000311

;ll fac[n]

,dp[n]

;int a[n]

;void

init()

}int

main()

sort

(a+1

,a+1

+m);

ll ans=fac[n]

;for

(int i=

1; i<=m;

++i)

ans=

(ans-dp[i]

*fac[n-a[i]

]%mod+mod)

%mod;

}printf

("%lld\n"

,ans)

;return0;

}

牛客練習賽71 C 數學考試

link 題意 求長度為n的排列有多少個 要求滿足 m個條件 pi 表示前pi個數不是1 pi的全排列 m第一次遇到這樣的dp狀態 很奇妙。它是通過列舉最後乙個不滿足條件的位置來得到答案,所以不會減重複。學到了 2 常規dp,dp i j 表示第i個位置以及之前的數最大值為j的方案數,那麼對於限制條...

牛客練習賽71 C 數學考試 dp

求 1 sim n 的排列,有 m 個限制條件,第 i 個限制條件 p i 表示前 p i 個數不能是 1 sim p i 的排列,求符合要求的排列的個數。答案對 20000311 取模。n le 2000,m,p i 設 dp i j 為滿足限制的情況下放好了排列的前 i 個數且最大值為 j 的方...

牛客 NC15553 數學考試

思路 先把字首和求出來.類似於dp,當前節點為i的時候,我們要記錄下i之前的連續k個數和的最大值lmax.這就是第一段 然後讓j i k,讓rmax a j a i 這樣然後max max max,lmax rmax 這樣的複雜度是o n 看 include include include incl...