HDU 5145 - NPY and girls
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Failed to start fire
- 下一篇: servlet的由来