\(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; }