時間限制: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...