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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 5145 - NPY and girls

發布時間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 5145 - NPY and girls 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意: cases T(1≤T≤10) (0<n,m≤30000) (0<ai≤30000)
???   

    n個數ai 表示n個女孩所在教室

?

    m次詢問 [L,R](1 <= L <= R <= n)
???  

    問訪問所有女孩的順序方案數(進教室順序)為多少(一次進教室只能訪問一個人)
?? ?
分析:

    莫隊算法 + 排列數

?

    一個區間內的方案數為 C(m,c1)*C(m-c1,c2)*C(m-c1-c2,c3)*....*C(cn,cn)
???   

    每次轉移通過下式:

?

     C(m+1,n+1) = C(m,n) * (m+1/n+1)
???????  

     C(m,n) = C(m+1,n+1) * (n+1/m+1) (對于縮小的過程而言)
?? ?
???   因為需要對大素數取模,除法就是乘上對應的乘法逆元,故先用費馬小定理

?

#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; const int MOD = 1000000007; const int MAXN = 30005; const int MAXM = 30005; struct Query {int L,R,id; }node[MAXM]; struct Ans {long long a; }ans[MAXM]; int a[MAXN],num[MAXN]; long long inv[MAXN];//乘法逆元 int t,n,m,unit; void work() {long long temp = 1;memset(num,0,sizeof(num));int L = 1 , R = 0;for(int i = 0; i < m ; i++){while(R < node[i].R)//C(m+1,n+1) = C(m,n)*(m+1/n+1) {R++;num[a[R]]++;temp = temp * (R - L + 1) % MOD * inv[num[a[R]]] % MOD;}while(R > node[i].R)//C(m,n) = C(m+1,n+1)*(n+1/m+1) {temp = temp * num[a[R]] % MOD * inv[R - L + 1] % MOD;num[a[R]]--;R--;}while(L < node[i].L)//C(m,n) = C(m+1,n+1)*(n+1/m+1) {temp = temp * num[a[L]] % MOD * inv[R - L + 1] % MOD;num[a[L]]--;L++;}while(L > node[i].L)//C(m+1,n+1) = C(m,n)*(m+1/n+1) {L--;num[a[L]]++;temp = temp * (R - L + 1) % MOD * inv[num[a[L]]] % MOD;}ans[node[i].id].a = temp;} } bool cmp(Query a,Query b) {if(a.L/unit != b.L/unit) return a.L/unit < b.L/unit;else return a.R < b.R; } void Init()//femat {inv[1] = 1;for(int i = 2; i < MAXN; i++) inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD; } int main() {Init();scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i = 1; i <= n; i++) scanf("%d",&a[i]);for(int i = 0; i < m; i++){scanf("%d%d",&node[i].L,&node[i].R);node[i].id = i;}unit = (int)sqrt(n);sort(node,node+m,cmp);work();for(int i = 0; i < m ;i++)printf("%lld\n",ans[i].a);} }

?

轉載于:https://www.cnblogs.com/nicetomeetu/p/5709207.html

總結

以上是生活随笔為你收集整理的HDU 5145 - NPY and girls的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。