日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 6044 Limited Permutation(2017多校)【计数 快速读入挂 线性逆元】

發(fā)布時間:2025/6/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 6044 Limited Permutation(2017多校)【计数 快速读入挂 线性逆元】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目傳送門:http://acm.hdu.edu.cn/showproblem.php?pid=6044

?

題意:

對于有n個元素的全排列的合法性定義為:有n個區(qū)間,對于第i個區(qū)間[li,ri]有l(wèi)i<=i<=ri,對于任意1<=L<=i<=R<=n,當(dāng)前僅當(dāng)li<=L<=i<=R<=ri時P[i]=min(P[L],P[L+1],...,P[R])。

求排列的合法方案數(shù);

?

解題思路:

大佬講的很清楚了:https://blog.csdn.net/qq_31759205/article/details/76146845

前期技能:

①快速讀入掛

②線性求階乘逆元

為什么這樣排序之后 dfs 一定是合理的呢?

因為題目給出的是 N 個區(qū)間, 每個區(qū)間對應(yīng)一個值,因為每個區(qū)間的合法定義都是唯一的,

也就是說序列中的每一個值其實對應(yīng)一個區(qū)間,所以dfs區(qū)間是合理的,如果區(qū)間出現(xiàn)不合法的情況則說明無解。

?

AC code:

1 #include <bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 #define LL long long 4 using namespace std; 5 const int MAXN = 1e6+10; 6 const LL mod = 1e9+7; 7 LL fac[MAXN], Inv[MAXN]; 8 9 namespace IO{ 10 const int MAX = 4e7; 11 char buf[MAX]; int c, sz; //預(yù)先緩沖到數(shù)組buf 12 void begin(){ 13 c = 0; 14 sz = fread(buf, 1, MAX, stdin); 15 } 16 inline bool read(int &t){ 17 while(c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++; 18 if(c >= sz) return false; 19 bool flag = 0; if(buf[c] == '-') flag = 1, c++; 20 for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t*10+buf[c]-'0'; 21 if(flag) t=-t; 22 return true; 23 } 24 } 25 26 void Init() //預(yù)處理排列數(shù)和逆元 27 { 28 fac[0] = Inv[0] = fac[1] = Inv[1] = 1; 29 for(int i = 2; i < MAXN; i++) fac[i] = fac[i-1]*i%mod; 30 for(int i = 2; i < MAXN; i++) Inv[i] = (mod-mod/i)*Inv[mod%i]%mod; 31 for(int i = 2; i < MAXN; i++) Inv[i] = Inv[i]*Inv[i-1]%mod; 32 } 33 34 LL C(LL n, LL m) //計算組合數(shù) 35 { 36 return fac[n]*Inv[m]%mod*Inv[n-m]%mod; 37 } 38 39 struct Node 40 { 41 int l, r; 42 int id; 43 }a[MAXN]; 44 45 bool cmp(const Node s1, const Node s2) 46 { 47 if(s1.l == s2.l) return s1.r > s2.r; 48 return s1.l < s2.l; 49 } 50 int ii; 51 LL dfs(int L, int R) 52 { 53 if(a[ii].l != L || a[ii].r != R) return 0; 54 int mid = a[ii++].id; 55 LL fL = 1LL, fR = 1LL; 56 if(L <= mid-1) fL = dfs(L, mid-1); //左區(qū)間方案數(shù) 57 if(R >= mid+1) fR = dfs(mid+1, R); //右區(qū)間方案數(shù) 58 LL cc = C(R-L, mid-L); 59 return fL*fR%mod*cc%mod; 60 } 61 62 int main() 63 { 64 Init(); 65 int N, Case = 1; 66 IO::begin(); 67 while(IO::read(N)){ 68 for(int i = 1;i <= N; i++) IO::read(a[i].l); 69 for(int i = 1;i <= N; i++) IO::read(a[i].r), a[i].id = i; 70 sort(a+1, a+1+N, cmp); ii = 1; 71 LL ans = dfs(1, N); 72 printf("Case #%d: %lld\n", Case++, ans); 73 } 74 return 0; 75 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/ymzjj/p/10804618.html

總結(jié)

以上是生活随笔為你收集整理的HDU 6044 Limited Permutation(2017多校)【计数 快速读入挂 线性逆元】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。