\(G\)系共有\(n\)位同窗,\(M\)門必修課。這\(N\)位同窗的編號爲\(0\)到\(N-1\)的整數,其中\(B\)神的編號爲\(0\)號。這\(M\)門必修課編號爲\(0\)到\(M-1\)的整數。一位同窗在必修課上能夠得到的分數是\(1\)到\(U_i\)中的一個整數。
若是在每門課上\(A\)得到的成績均小於等於\(B\)得到的成績,則稱\(A\)被\(B\)碾壓。在\(B\)神的說法中,\(G\)系共有\(K\)位同窗被他碾壓(不包括他本身),而其餘\(N-K-1\)位同窗則沒有被他碾壓。\(D\)神查到了\(B\)神每門必修課的排名。
這裏的排名是指:若是\(B\)神某門課的排名爲\(R\),則表示有且僅有\(R-1\)位同窗這門課的分數大於\(B\)神的分數,有且僅有\(N-R\)位同窗這門課的分數小於等於\(B\)神(不包括他本身)。
咱們須要求出全系全部同窗每門必修課得分的狀況數,使其既能知足\(B\)神的說法,也能符合\(D\)神查到的排名。這裏兩種狀況不一樣當且僅當有任意一位同窗在任意一門課上得到的分數不一樣。
你不須要像\(D\)神那麼厲害,你只須要計算出狀況數模\(10^9+7\)的餘數就能夠了。spa
第一行包含三個正整數\(N,M,K\),分別表示\(G\)系的同窗數量(包括\(B\)神),必修課的數量和被\(B\)神碾壓的同窗數量。
第二行包含\(M\)個正整數,依次表示每門課的最高分\(U_i\)。
第三行包含\(M\)個正整數,依次表示\(B\)神在每門課上的排名\(Ri\)。保證\(1 \le R_i \le N\)。
數據保證至少有1種狀況使得\(B\)神說的話成立。code
僅一行一個正整數,表示知足條件的狀況數模\(10^9+7\)的餘數。io
3 2 1 2 2 1 2
10
根據題意,同窗們是互不相同的。那麼既然\(k\) 名同窗被\(B\)神碾壓,方案數即是\(C^k_{n-1}\)。
而後\(n-k-1\)\((\)記爲\(num\)\()\)名同窗是沒有被\(B\)神碾壓的,因此每人都至少有一科比\(B\)神高。已知\(B\)神每一科的排名\(R_k\),考慮比\(B\)神這科分數高的人的方案,爲\(C^{Rk-1}_{num}\)。
把 \(m\) 科一塊兒算,方案數爲\[\prod_{k=1}^{m} {C^{R_k-1}_{num}}\]
但上述有個問題,按上面的方法,\(num\)人中可能有人沒有一科比\(B\)神高,因此
容斥一下。得
\[T=\sum_{i=0}^{num}(-1)^{num-i} C_{num}^i T_{i}\]
\[=\sum_{i=0}^{num}(-1)^{num-i} C_{num}^i\prod_{k=1}^{m} {C^{R_k-1}_{i}}\]
那麼到如今 \(C^{k}_{n-1}T\) 即爲同窗比B神的成績相對大小的方案數。不過尚未考慮分數的問題。
先考慮單科,考慮某一科知足B神排名爲 \(Ri\) 的方案數。
首先,\(n\) 個同窗分佈在 \(x\) 份內的方案顯然爲 \(x^n\) (最低爲1分,開始我沒好好讀題覺得能夠有0分卡了很久),由於咱們只是考慮同窗與B神的分數高低方案,同窗間的高低沒算在內,因此不是組合數形式...
由於 \(Ri-1\) 名同窗必須嚴格大於B神,\(n-Ri\) 名同窗是小於等於B神,因此不能簡單乘一乘,那就枚舉b神的分數
\[Si=\sum_{x=1}^{Ui} x^{n-Ri}(Ui-x)^{Ri-1}\]
這顯然會T,由於 \(Ui\) 很大。
因此根據經驗就亂搞一下———把後面的\((Ui-x)^{Ri-1}\)展開應該會很不錯。而後交換一下求和的順序。
\[Si=\sum_{x=1}^{Ui} x^{n-Ri}(Ui-x)^{Ri-1}\] \[=\sum_{x=1}^{Ui} x^{n-Ri} \sum_{t=0}^{Ri-1}(-1)^t C^t_{Ri-1}Ui^{Ri-1-t}x^t\] \[=\sum_{x=1}^{Ui} \sum_{t=0}^{Ri-1}(-1)^t C^t_{Ri-1}Ui^{Ri-1-t}x^t x^{n-Ri}\] \[= \sum_{t=0}^{Ri-1}(-1)^t C^t_{Ri-1}Ui^{Ri-1-t}\sum_{x=1}^{Ui}x^{n-Ri+t}\]
那麼這個東西就可求了。求出 \(\sum_{x=1}^{Ui}x^{n-Ri+t}\)就能夠了。
怎麼就可求了呢?
考慮如何求\(1^2+2^2+3^2+4^2+...+n^2\)的值。其中一種方法爲:
設\(Tn=(n+1)^3-n^3\),有
\[Tn=(n+1)^3-n^3=3n^2+3n+1\]
而後顯然的是
\[\sum_{i=1}^n Ti=(n+1)^3-n^3+n^3-(n-1)^3+...-1^3\] \[=(n+1)^3-1\]
根據上面還有
\[\sum_{i=1}^n Ti=3 \sum_{i=1}^n i^2+3\sum_{i=1}^ni+\sum_{i=1}^n1\]
則
\[1^2+2^2+3^2+4^2+...+n^2=\frac{(n+1)^3-1-3\sum_{i=1}^ni+\sum_{i=1}^n1}{3}\]
因此對於 \(1^t+2^t+3^t+...+n^t\) 能夠用相似方法求。把這個數列記爲 \(X_t^n\),則有
\[(n+1)^{t+1}-1=\sum_{i=0}^t C_{t+1}^{t-i+1} X_i^n\]table
\[X_t^n=\frac{(n+1)^{t+1}-1-\sum_{i=0}^{t-1} C_{t+1}^{t-i+1}X_i^n}{C_{t+1}^{1}}=\frac{(n+1)^{t+1}-1-\sum_{i=0}^{t-1} C_{t+1}^{t-i+1}X_i^n}{t+1}\]class
\[X_0^n=n\]方法
能夠在\(O(t^2)\)時間內獲得 \(X\)。
認真考慮一下,好像沒有別的了。固然乘一塊兒。
\[ans=C^k_{n-1}T\prod_{i=1}^m Si\] \[=C^k_{n-1}(\sum_{i=0}^{num}(-1)^{num-i}C_{num}^i \prod_{k=1}^{m} {C^{R_k-1}_{i}})\prod_{i=1}^m \sum_{t=0}^{Ri-1}(-1)^t C^t_{Ri-1}Ui^{Ri-1-t}X_{n-Ri+t}^{Ui}\]
複雜度\(O(mn^2)\),主要在於處理 \(X\) 。經驗
#include <cstdio> #define max(a,b) (a)>(b)?(a):(b) using namespace std; const int MAXN=233; const long long mod=1000000007; int n,m,nm,num,k; long long fac[MAXN],Inv[MAXN],inv[MAXN],U[MAXN],R[MAXN],x[MAXN][MAXN]; inline long long qpow(long long a,long long b,long long mod) { long long res=1; while (b) { if (b&1) res=res*a%mod; a=a*a%mod;b>>=1; } return res; } inline void take_table() { fac[0]=1;inv[1]=1; for (int i=1;i<=nm+10;i++) fac[i]=1ll*fac[i-1]*i%mod; Inv[nm+10]=qpow(fac[nm+10],mod-2,mod); for (int i=nm+10;i>=1;i--) Inv[i-1]=1ll*Inv[i]*i%mod; for (int i=2;i<=nm+10;i++) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod; } inline long long comb(long long n,long long m) { if (n==m) return 1; return 1ll*fac[n]*Inv[m]%mod*Inv[n-m]%mod; } inline long long A() { long long res,ans=0; for (int i=num,f=-1;i>=0;i--) { res=1;f=-f; for (int j=1;j<=m;j++) res=res*comb(i,R[j]-1)%mod; ans=(ans+res*f*comb(num,i)+mod)%mod; } return ans; } inline long long B() { long long res,fina=1,ans; for (int i=1;i<=m;i++) for (int j=0;j<=n;j++) { res=0; for (int k=0;k<=j-1;k++) res=(res+1ll*x[i][k]*comb(j+1,j-k+1)%mod)%mod; x[i][j]=1ll*(qpow(U[i]+1,j+1,mod)-1-res+mod)%mod*1ll*inv[j+1]%mod; } for (int i=1;i<=m;i++) { ans=0; for (int j=0,f=1;j<R[i];j++,f=-f) ans=(ans+f*comb(R[i]-1,j)*qpow(U[i],R[i]-j-1,mod)%mod*x[i][n-R[i]+j]%mod+mod)%mod; fina=(fina*ans%mod+mod)%mod; } return fina; } int main() { scanf("%d%d%d",&n,&m,&k);num=n-k-1;nm=max(n,m); for (int i=1;i<=m;i++) scanf("%lld",&U[i]); for (int i=1;i<=m;i++) scanf("%lld",&R[i]); take_table(); printf("%lld\n",A()*B()%mod*comb(n-1,k)%mod); return 0; }